几天前初次接触python爬虫,从静态网页开始练习最后爬取优酷世界杯的相关评论并做出相关分析,在此记录一下
首先需要使用pip安装scrapy框架,安装过程不再赘述,其中可能会遇到一些需要c++类库的报错,在网上下载安装这些类库,重新安装即可。
这里选择了凤凰网的即时新闻http://2018.ifeng.com/listpage/111171/3/1/59053593/59054362/list.shtml
爬取这个页面的标题、摘要、图片链接、时间四个字段。
首先使用pycharm自带的命令窗口来执行
工具栏 --- View --- Toolwindows --- Terminal
在命令行中输入: scrapy genspider [爬虫名] [网址]生成爬虫文件
生成成功后会在spider文件夹里生成爬虫文件
# -*- coding: utf-8 -*-
import scrapy
class NewsSpider(scrapy.Spider):
name = 'news'
start_urls = ['http://2018.ifeng.com/listpage/111171/1/list.shtml/']
def parse(self, response):
这里,name是一个必填项,它是这个爬虫的名字,可以在命令行中通过这个名字开启这个爬虫.start_urls和parse方法也不是我随便起的名
字,它是有一定含义的,在爬虫启动后,会自动对start_urls中的网址发起请求,而得到的response会默认返回至parse方法。
由于这个网页是一个静态页面,所以在response中可以得到其html代码:
在得到代码后我们需要使用选择器对我们需要的内容进行定位,选择器可以使用xpath、也可以使用css选择器,这里主要使用
xpath选择器。关于xpath选择器、可以查看xpath选择器教程,大概看看就好,因为在chorme中可以直接获取某一结点的xpath。
在chorme中某个元素上右键点击检查会出现这一部分对应的源代码,然后选择select ->copy xpath就可以选择这个节点的xpath
对于元素的提取主要在parse函数中
def parse(self, response):
for news in response.xpath('//div[@class="box_list clearfix"]'):
name = news.xpath('./h2/a/@title').extract_first()
time = news.xpath('./div[2]/span/text()').extract_first()
abstract = news.xpath('./div[2]/p/text()').extract_first()
img = news.xpath('./div[1]/a/img/@src').extract_first()
pagelink = news.xpath('./h2/a/@href').extract_first()
yield {
'name': name,
'time': time,
'abstract': abstract,
'smallImg': img,
'pagelink': pagelink,
}
# 下一页
next_url = response.css('#pagenext::attr(href)').extract_first()
if next_url:
next_url = response.urljoin(next_url)
yield scrapy.Request(next_url, callback=self.parse)
在chorme浏览器中对应元素位置点击右键即可选中该元素的xpath,在分析完这一页后,再根据页面中下一页中的按钮的href发送一个新的request,在新的requsest中指定使用callback指定回掉函数,这样新的request返回的response又会被parse函数解析。直到没有下一页为止。这样就完成了这个静态页面的爬取。
需要注意的几个问题:
1、在pycharm中如何启动爬虫
我使用的方式是新建一个begin文件,其中模拟命令行输入执行命令,然后设置从这个begin文件开始执行
begin文件中的代码
from scrapy import cmdline
cmdline.execute('scrapy crawl news -o news.csv'.split())
再将edit configurations中的script path设位begin.py即可执行
2如果之前在安装时出现了缺少C++类库的问题,在pycharm中添加scrapy环境后运行依旧会出现这个问题,这个问题的原因是pycharm在每个项目中的环境是自己又重新下载了一份,在venv文件夹中,这时候我们希望每个文件中的环境文件能够继承自我们的python安装目录,我们可以勾选这个选项。