使用scrapy访问网页
在正式写爬虫代码之前,先用scrapy访问网页玩一玩,形成初步概念(安装参考scrapy安装)。
启动scrapy
打开终端输入scrapy shell "https://quotes.toscrape.com/"
(注意:不用启动python,直接在命令行里输入并回车执行)。scrapy开始运行,界面最下方光标处为>>>
,是scrapy自行启动了python交互界面并且完成了对网页的爬取。爬取结果储存在response
对象里。
试试看在交互界面里输入response.css('title').getall()
并回车。如下图所示,返回了一个列表,列表中的元素为'<title>Quotes to Scrape</title>'
,就是爬取到的网页的标题了。
查看页面
接下来在交互界面里输入view(response)
,程序会唤起浏览器打开爬取到的网页内容,这个网站摆了每页十句引述供爬取。我们试试看用scrapy爬取第一句引述。随便选中引述的一部分,在右键菜单中选择“查看元素“。
点击“查看元素”后会打开如下图界面,点击蓝色高亮行的三角形图标,展开该代码块,就可以看到整句引述的内容:“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”(如果这句引述比较短的话不会折叠,直接跟span显示在同一行。)
爬取引述
在代码块中选中这句引述(不一定是同一句话,网页会更新),右键并在菜单栏中选择“复制->XPath”。粘贴到别处看看,可以看到剪贴板的内容是/html/body/div/div[2]/div[1]/div[1]/span[1]/text()
。如果你选到的引述跟span在同一行,那么复制过来的内容可能末尾是/span[1]
,要自己在下一步手动补上/text()
。
现在可以回到终端了,把剪贴板的内容粘贴到response.xpath('').get()
两个单引号之间,并输入到交互界面。执行结果如下图所示,我们通过xpath获取了response对象中的这句引述文本。返回值中有两层引号,内层是网页原文中的引述包含的双引号,外层是用来标识python中字符串的引号。
批量爬取引述
查看两句引述的xpath,就可以发现想要查询不同位置的引述,只需要在xpath中修改最后一个div的索引。可以用循环遍历1到10的的xpath来获取所有引述。
另一种方法是使用has-class
。执行response.xpath('//span[has-class("text")]/text()').getall()
指令,就可以得到包含十句引述的列表。
指令中的关键是span[has-class("text")]
,起到了选出response对象中所有含有text
类的span。可以在“检查元素”唤出的检查器里使用查找功能,查找有多少个span下的text。点击问号进入搜索栏,输入span.text
来查找,可以看到搜索到了10个<span class="text" ...>
。这里查找到的元素就是span[has-class("text")]
会索引到的所有元素。