js提取指定网站内容(爬虫学哪个库好?Python爬虫库对比分析(一))
优采云 发布时间: 2021-12-25 08:17js提取指定网站内容(爬虫学哪个库好?Python爬虫库对比分析(一))
读者经常在哪个图书馆学习爬虫?其实常用的Python爬虫库无非是requests、selenium和scrapy,每个库都有自己的特点。对我来说,没有最推荐的库,只有最合适的库。本文将基于一个简单的爬虫案例(Python爬取起点中文网站)对三个库进行对比分析(从时间角度)
目标需求是批量采集排名书信息,如下图:
页面结构易于分析。排行榜有100本书信息,一个静态页面收录20条数据。使用不同的第三方库来分析和提取数据,它们是:
然后在逻辑代码的开头和结尾加上时间戳,得到程序运行时间,比较效率。
这里,因为xpath是用来提取数据的,所以xpath语句的三种方式是类似的,这里先对数据分析做一下说明:
1. imgLink: //div[@class='book-img-text']/ul/li/div[1]/a/@href
2. title: //div[@class='book-img-text']/ul/li//div[2]/h4/a/text()
3. author: //div[@class='book-img-text']/ul/li/div[2]/p[1]/a[1]/text()
4. intro: //div[@class='book-img-text']/ul/li/div[2]/p[2]/text()
5. update://div[@class='book-img-text']/ul/li/div[2]/p[3]/a/text()
一、请求
首先导入相关库
from lxml import etree
import requests
import time
逻辑代码如下
start = time.time() # 开始计时⏲
url = 'https://www.qidian.com/rank/yuepiao?style=1&page=1'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
}
page = requests.get(url,headers=headers)
html = etree.HTML(page.content.decode('utf-8'))
books = html.xpath("//div[@class='book-img-text']/ul/li")
for book in books:
imglink = 'https:' + book.xpath("./div[1]/a/@href")[0]
# 其它信息xpath提取,这里省略 ....
update = book.xpath("./div[2]/p[3]/a/text()")[0]
print(imglink,title,author,intro,update)
end = time.time() # 结束计时⏲
print(end-start)
程序运行结果如下
可以看到爬下所有数据需要0.823s。
二、 硒
首先导入相关库
import time
from selenium import webdriver
代码实现如下
url = 'https://www.qidian.com/rank/yuepiao?style=1&page=1'
start = time.time() # 开始计时⏲
driver = webdriver.Chrome()
driver.get(url)
books = driver.find_elements_by_xpath("//div[@class='book-img-text']/ul/li")
for book in books:
imglink = 'https:' + book.find_element_by_xpath("./div[1]/a").get_attribute('href')
# 其它小说信息的定位提取语句,...
update = book.find_element_by_xpath("./div[2]/p[3]/a").text
print(imglink,title,author,intro,update)
end = time.time() # 结束计时⏲
print(end-start)
# 18.564752340316772
运行结果如下
可以看到时间是18.8174s
三、Scrapy
最后是Scrapy的实现,代码如下
import scrapy
import time
class QdSpider(scrapy.Spider):
name = 'qd'
allowed_domains = ['qidian.com']
start_urls = ['https://www.qidian.com/rank/yuepiao?style=1&page=1']
def parse(self, response):
start = time.time() # 开始计时⏲
books = response.xpath("//div[@class='book-img-text']/ul/li")
for book in books:
imglink = 'https:' + book.xpath("./div[1]/a/@href").extract_first()
# 其它信息的xpath提取语句,......
update = book.xpath("./div[2]/p[3]/a/text()").extract_first()
print(imglink, title, author, intro, update)
end = time.time() # 结束计时⏲
print(end - start)
运行结果如下
可以看到运行时间只用了0.016s
四、结果分析
从代码量来看:其实代码量没有太大区别,因为实现逻辑比较简单。
但是在运行时间方面:scrapy最快,只需要不到0.02s,selenium最慢,需要将近20s,运行效率是scrapy的1/1000。但是,与 requests 和 selenium 相比,在 scrapy 中开发和调试代码需要更长的时间。
我正在仔细研究原因
”
requests:请求模拟浏览器请求。下载请求的网页内容后,不会执行js代码。
为什么 selenium 最慢:首先,Selenium 是 Web 应用程序的自动化测试工具。Selenium 测试直接在浏览器中运行(支持多种浏览器,Google、Firefox 等)来模拟用户操作来获取网页渲染。导致selenium解析并执行网页的CSS和js代码,效率低下。
scrapy框架的爬取效率最高:首先,和requests一样,scrapy不执行web js代码,但是我们知道scrapy是一个提取结构化数据的应用框架。Scrapy 使用了 Twisted 异步 web 框架,可以加快我们的下载速度。, 并发性好,性能高,所以效率最高。
”
五、补充
通过上面的简单测试,我们可能会觉得selenium效率太低了。是不是因为数据采集在selenium中不常用?只能说,在可以爬取数据的前提下,采集 高效的方法会是首选。
所以这篇文章的目的不是要说明不要使用selenium。接下来我们来看看招聘网站--拉勾招聘页面数据采集。随机选择一个帖子java,页面如下:
5.1 请求实现
如果您使用 requests 来请求数据
你会发现没有数据,网页已经进行了反爬虫处理。这时候硒就派上用场了。无需分析网站反爬方法,直接模拟用户请求数据(大多数情况下也有反硒反爬方法)。攀登手段)
5.2 selenium 实现
上面提到,如果你使用requests或者scrapy爬虫来寻找反爬虫的措施,你可以试试selenium,这个有时候很简单
from selenium import webdriver
url = 'https://www.lagou.com/zhaopin/Java/?labelWords=label'
driver = webdriver.Chrome()
driver.get(url)
items = driver.find_elements_by_xpath("//ul[@class='item_con_list']/li")
print(len(items))
for item in items:
title = item.find_element_by_xpath("./div[1]/div[1]/div[1]/a/h3").text
print(title)
运行结果如下:
页面的数据很容易提取!
因此,根据本文的案例分析,如果有爬虫需求,在某一个方法中冻结该方法并不是一个好的选择。大多数情况下,我们需要根据对应网站/app的特点和具体需求进行集成判断,选择最合适的爬虫库!
,