爬虫实战--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

爬取目标:

爬虫实战--JS破解+爬取制药食品_第1张图片

分析网页:

我们点击下一页按钮发现一个奇怪的事情,无论怎么点击url是不变的,但是网页的内容是改变的。此时我们就该联想到是生成的信息。

如下所示:

爬虫实战--JS破解+爬取制药食品_第2张图片

此刻,我们检查元素试试看:

爬虫实战--JS破解+爬取制药食品_第3张图片

通过慢慢的查找,我们可以从这里找到我们所需要的信息。这个时候,我们可以尝试将上图箭头所指的参数返回结果找出来,看看返回的是什么,来到console界面:

爬虫实战--JS破解+爬取制药食品_第4张图片

这个时候我们终于找到了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)

下面进行详情页网址的分析查找:

右键检查:

爬虫实战--JS破解+爬取制药食品_第5张图片

但是当我们点击链接的时候并没有跳转到另一个页面。那么我们怎样去获得这个详情页呢?

再来仔细观察一下链接和网址的异同点:

网站如下:

爬虫实战--JS破解+爬取制药食品_第6张图片

链接如下:

有没有什么联想,如果我们把网址的前半部分和链接的后半部分拼接在一起,会产生什么样的网址呢?试试:

拼接后的链接如下:

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

打开上面这个拼接后的链接,我们即可看到如下的界面:

爬虫实战--JS破解+爬取制药食品_第7张图片

要爬的详情页是不是都有了?

接下来就是,我们去请求页面,获取数据,然后存放到数据库就可以大功告成了。

代码如下:

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

数据库存储的结果如下:

此处选取一部分展示:

爬虫实战--JS破解+爬取制药食品_第8张图片

 

 

 

 

 

 

 

 

你可能感兴趣的:(爬虫)