爬蟲實戰--JS破解+爬取製藥食品
阿新 • • 發佈:2018-11-30
網址如下:
爬取目標:
分析網頁:
我們點選下一頁按鈕發現一個奇怪的事情,無論怎麼點選url是不變的,但是網頁的內容是改變的。此時我們就該聯想到是生成的資訊。
如下所示:
此刻,我們檢查元素試試看:
通過慢慢的查詢,我們可以從這裡找到我們所需要的資訊。這個時候,我們可以嘗試將上圖箭頭所指的引數返回結果找出來,看看返回的是什麼,來到console介面:
這個時候我們終於找到了url列表頁:
破解程式碼如下:
from selenium import webdriver ch = webdriver.Chrome() ch.get('http://app1.sfda.gov.cn/datasearch/face3/base.jsp?tableId=25&tableName=TABLE25&title=%B9%FA%B2%FA%D2%A9%C6%B7&bcId=124356560303886909015737447882') ascp = ch.execute_script('return oldContent') print(ascp)
下面進行詳情頁網址的分析查詢:
右鍵檢查:
但是當我們點選連結的時候並沒有跳轉到另一個頁面。那麼我們怎樣去獲得這個詳情頁呢?
再來仔細觀察一下連結和網址的異同點:
網站如下:
連結如下:
有沒有什麼聯想,如果我們把網址的前半部分和連結的後半部分拼接在一起,會產生什麼樣的網址呢?試試:
拼接後的連結如下:
開啟上面這個拼接後的連結,我們即可看到如下的介面:
要爬的詳情頁是不是都有了?
接下來就是,我們去請求頁面,獲取資料,然後存放到資料庫就可以大功告成了。
程式碼如下:
from selenium import webdriver
from urllib.parse import urlencode
from bs4 import BeautifulSoup
from pybloom_live import BloomFilter
import re
import os
import datetime
import pymysql
def get_data():
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"')
browser = webdriver.Chrome(chrome_options=options)
#url的拼接
for i in range(1,50):
get_parms = {
'tableId': '25',
'tableName': 'TABLE25',
'tableView': '國產藥品',
'Id': i
}
base_url = 'http://app1.sfda.gov.cn/datasearch/face3/content.jsp?'+urlencode(get_parms)
print(base_url)
#利用布隆過濾器去重處理
if bloom_url(base_url):
browser.get(base_url)
# 獲取最初的html
content = browser.page_source
#對錯誤頁面進行處理
conn = re.compile('沒有相關資訊',re.S)
Fail_key = re.search(conn,content)
if Fail_key:
print('Faild,網頁連結失效')
continue
soup = BeautifulSoup(content,'lxml')
#建立資料列表
item = [i,]
for tr in soup.find('tbody').find_all('tr')[1:-2]:
value = tr.find_all('td')[1].text
item.append(value)
insert_bdnews_data(item)
else:
print('網頁連結重複,正在重新請求')
continue
print(item)
def bloom_url(url):
"""
進行url去重處理,可能需要的請求資料過多,防止重複
:param url:對url進行判斷,看是否重複
:return:
"""
bloom_path = 'guochanyaopin.blm'
# 判斷是否存在這個檔案
is_exist = os.path.exists(bloom_path)
if is_exist:
bf = BloomFilter.fromfile(open(bloom_path,'rb'))
else:
#新建一個,儲存在記憶體中
bf = BloomFilter(1000000,0.01)
if url in bf:
return False
else:
#如果url不在檔案中,新增進去,寫入
bf.add(url)
bf.tofile(open(bloom_path,'wb'))
return True
def insert_bdnews_data(item):
"""存入資料庫"""
conn = pymysql.Connect(host="localhost",port=3306,user="root",password="123456",db="guoyao",charset='utf8')
cursor = conn.cursor()
sql_insert = "insert into guoyao1 values(%s,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')"%(item[0],item[1],item[2],item[3],item[4],item[5],item[6],item[7],item[8],item[9],item[10],item[11],item[12],item[13],item[14])
try:
cursor.execute(sql_insert)
conn.commit()
except Exception as e:
print('存入資料庫失敗',e)
cursor.close()
conn.close()
get_data()
資料庫儲存的結果如下:
此處選取一部分展示: