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()
数据库存储的结果如下:
此处选取一部分展示: