目标:输入关键字爬取 http://www.freefullpdf.com/#gsc.tab=0 内pdf文件的网址(本网站为国外pdf文件网站,需要代理)
方法一:在浏览器上输入这个url,然后在这个网址的搜索框中随意输入一个关键字会发现网址栏的url会变为 http://www.freefullpdf.com/#gsc.tab=0&gsc.q=python&gsc.sort=&gsc.page=1, 再输入其他关键字发现其中“q=python"这里就是我输入的关键字,而”page=1“是控制翻页,于是通过通过改变这两个参数来让selenium爬取数据
缺点:这种方法确实可以爬取出js渲染的数据,但是效率堪忧。后面我又尝试啦 ”selenium+无界面浏览器 “ 进行爬取,但是结果也并不理想
方法二:在Network中找到js数据的请求网址,直接使用 ”requests.get()“ 直接请求,再解析获取的js数据
接下来我们来看下我的实际代码部分:
方法一:
from selenium import webdriver
from pymongo import MongoClient
import hashlib
#这里我从MongoDB数据库中取出关键字,然后作为参数查询(关于MongoDB的相关python的使用请自行查找)
conn=MongoClient("获取关键字数据库的ip地址",27017)#取关键字的数据库
db=conn.Runoob
my_set=db.Runoob
conn2=MongoClient("存数据的数据库",27017)#存数据的数据库
db2=conn2.test4
my_set2=db2.url_set2
def download_data(keyword,page): #里面封装了存数据的内容,参数传入关键字keyword,页数page
browser = webdriver.Chrome() #chrome对应的驱动版本直接百度下载后放入python安装目录下的Script文件夹内
browser.get("http://www.freefullpdf.com/#gsc.tab=0&gsc.q="+keyword+"&gsc.sort=&gsc.page="+str(page))
node_list = browser.find_elements_by_xpath("//div[@class='gs-title']/a[@class='gs-title']") # 获取href所在的节点(该节点包含啦文件url与title),返回list
# print(node_list)
print(len(node_list))
#href的存放我使用啦MD5加密,其实三句话就可以搞定
#上面我通过find_elements_by_xpath ,即xpath获取节点列表,除最后一页每页数据都是10个,所以这里可以直接使用下标获取单个节点,然后通过get_attribute('href')获取节点的href属性(注意MD5这里放入update内的数据需要encode())
#这里我获取节点的方法采用的是xpath,我个人认为这个爬取的过程中比较重要的就是获取节点这部分,我过j几天会单独发布一个关于xpath/bs4/pyquery的基础使用
if len(node_list)==11: #除最后一页每页数据都是10个,所以不是最后一页的数据使用批量存入
MD5_href0 = hashlib.md5() #构造对象
MD5_href0.update(node_list[0].get_attribute('href').encode())
MD5_href1 = hashlib.md5()
MD5_href1.update(node_list[1].get_attribute('href').encode())
MD5_href2 = hashlib.md5()
MD5_href2.update(node_list[2].get_attribute('href').encode())
MD5_href3 = hashlib.md5()
MD5_href3.update(node_list[3].get_attribute('href').encode())
MD5_href4 = hashlib.md5()
MD5_href4.update(node_list[4].get_attribute('href').encode())
MD5_href5 = hashlib.md5()
MD5_href5.update(node_list[5].get_attribute('href').encode())
MD5_href6 = hashlib.md5()
MD5_href6.update(node_list[6].get_attribute('href').encode())
MD5_href7 = hashlib.md5()
MD5_href7.update(node_list[7].get_attribute('href').