Scrapy作为一个强大的爬虫框架,具有强大的爬取网站和信息传输能力。Scrapy框架主要是分目录的形式,逐层对信息进行爬取。
网页的目录一般分为三个。以中国新闻网为例子:https://www.chinanews.com/
在新闻网的首页中,我们看到有这样的一栏。
这就是一级目录。通过网页解析器,我们发现这个ul标签下麦呢有很多的li标签,而li中包含的a标签中的href属性就是对应着某个类别新闻的列表。我们随便跳转一个href,就进入了第二目录。
这个网站的二级目录是属于动态网页,具体爬取的时候要传递post参数,这里就不展开说说了。看到该目录下有很多具体新闻,我们随便点进一个新闻,就进入了三级目录(其实我认为这不是目录了,就是新闻具体页)。scrapy框架即使逐层爬取,先把一级目录下面包含的二级目录爬取了,然后再爬取二级目录中的具体新闻url,最后根据url访问具体新闻页并爬取具体新闻。
接下来我说一下使用scrapy的一些小技巧。
- 有时候对于二级目录网页,有时候会有多种不同的样式,每种样式对应不同的解析方式,此时我们要用判断语句来选择不同的解析方式。
- BeautifulSoup使用find方法返回的是字符,判断时要判断是否为空,即soup.find(’…’,class_=’…’,id=’…’) != None
- 而select方法返回的必定是列表,若已知最后选择到想要的结果只有一个,直接选择第一个元素即可。但如果要用select来判断时,搭配使用len()函数可以判断,即if len(soup.select(‘…’)) :
- 有一些新闻具体页中是没有一二级category的,倘若想要爬取,就可能要在二级甚至一级目录中爬取,那么就存在参数传递的问题。此时就要用到meta参数,详细介绍就不说了,这里说一下啊具体用法。但我们从二级目录中获取了category,此时用一个字典item装着,然后在参数传递中这样写:yield Request(i.a[‘href’],callback=self.parse_3, meta={‘item’ : item}),之后在下一个函数中再获取一次这个item:item = response.meta[‘item’]
- 注意item中新闻的body需要拼接,按照字符传统拼接,一个加号就好了,但是要先声明item[‘body’]是个字符。同样,如果item中某个元素是个列表时,也要事先声明
- 有时候a标签中的url是不完整的,要记得补全
- 对于某个标签的某个属性,比如class,有多个class属性:
此时尽量不要在select方法中直接使用标签定位,因为很可能找不到,最好是使用find方法,因为find可以支持多个class,id属性。 - 有些时候我们想访问列表中的部分元素,可以在循环中使用list[0:-2]。