1. 程式人生 > >爬蟲實戰--JS破解+爬取製藥食品

爬蟲實戰--JS破解+爬取製藥食品

網址如下:

http://app1.sfda.gov.cn/datasearch/face3/base.jsp?tableId=25&tableName=TABLE25&title=%B9%FA%B2%FA%D2%A9%C6%B7&bcId=124356560303886909015737447882

爬取目標:

分析網頁:

我們點選下一頁按鈕發現一個奇怪的事情,無論怎麼點選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)

下面進行詳情頁網址的分析查詢:

右鍵檢查:

但是當我們點選連結的時候並沒有跳轉到另一個頁面。那麼我們怎樣去獲得這個詳情頁呢?

再來仔細觀察一下連結和網址的異同點:

網站如下:

連結如下:

有沒有什麼聯想,如果我們把網址的前半部分和連結的後半部分拼接在一起,會產生什麼樣的網址呢?試試:

拼接後的連結如下:

http://app1.sfda.gov.cn/datasearch/face3/content.jsp?tableId=25&tableName=TABLE25&tableView=%E5%9B%BD%E4%BA%A7%E8%8D%AF%E5%93%81&Id=29813

開啟上面這個拼接後的連結,我們即可看到如下的介面:

要爬的詳情頁是不是都有了?

接下來就是,我們去請求頁面,獲取資料,然後存放到資料庫就可以大功告成了。

程式碼如下:

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()

資料庫儲存的結果如下:

此處選取一部分展示: