scrapy笔记
步骤:
1.创建项目。
win + R 输入cmd调出命令行窗口,使用cd命令调整到要放项目的文件位置,输入scrapy startproject xxx(项目名称)命令创建项目
例如:在cmd窗口中输入scrapy startproject newsbaiduspider回车。
在项目文件夹下会生成两个文件
第一个文件夹是编写代码的文件,第二个.cfg文件为项目的配置文件部署在服务器时使用的。
newsbaiduspider文件下有一个文件夹和五个python文件。
整体的项目结构和文件的作用如下:
2.创建一个爬虫在项目文件夹下cmd窗口运行。
scrapy genspider xxx(爬虫名称)xxx.com(目标域名)
运行完成后将在spider文件夹下生成一个爬虫文件
注意爬虫文件的名字不要和项目的名称一样,不然会创建失败。
3.编写爬虫前的准备工作。
- 进入settings.py 将robots协议在settings.py中将ROBOTSTXT_OBEY 设为 False。
- 设置请求头(作用将爬虫伪装成浏览器浏览防止ip被封)。进入settings.py 文件设置USER_AGENT。
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
请求头的内容不需要刻意记忆可以随便打开一个网页,然后F12进入开发者工具,按图示步骤走(network没有内容的化根据提示ctrl+r来重载)。
- 为了减少运行scrapy产生的大量无用输出,可以在settings.py的文件中加入。
LOG_LEVEL = 'WARNING'
将日志输出级别设为warning。
- 编写启动脚本,这样就不用每次运行时在命令行中输入scrapy crawl +spidername了。在项目文件夹下新建一个python文件。
from scrapy import cmdline #导入cmdline
cmdline.execute('scrapy crawl newsspider -o 1.json'.split()) # 注意要split将字符串切一下。命令的意思为运行newsspider爬虫并用json文件来保存数据。
4.明确目标,此次抓取的目标是百度新闻导航栏,各个项目下的焦点(新闻标题+新闻链接)。
编写爬虫:由于爬取的是导航栏的各个选项,因此要一个选项一个选项的爬取。首先进入国内页面,将国内页面的焦点新闻抓取,抓取完成后访问国际页面,抓取焦点新闻,如此往复知道完成所有页面的爬取。
import scrapy
from scrapy import Request
class NewsspiderSpider(scrapy.Spider):
name = 'newsspider' # 爬虫名字
allowed_domains = ['news.baidu.com'] # 允许爬取的范围
start_urls = ['http://news.baidu.com'] # 起始网址
def parse(self, response, **kwargs):
types = ['guonei', 'guoji', 'mil', 'finance', 'ent', 'sports',
'internet', 'tech', 'game', 'lady', 'auto','house'] # 导航栏各个选项卡的标题
if response.url[22:] not in types: # 判断是否是导航栏网址
for ty in types: # 遍历导航栏
yield Request('http://news.baidu.com/'+ty) # 将获取的某一导航栏的响应抛出,链接通过字符串连接的到
else:
pages = response.xpath("//div[@class='l-left-col']//div[@class='b-left']/ul/li") # xpath获取焦点新闻部分
for page in pages:
urls = page.xpath("./a/@href").extract() # 提取焦点新闻的各个链接
title = page.xpath("./a/text()").extract() # 获取新闻标题
yield { # 将数据抛出
'urls': urls,
'title': title
}
5.设置输出格式。
进入settings.py文件,设置输出的编码,如果不该的话编码为Unicode码,汉字会乱码。
FEED_EXPORT_ENCODING = 'utf-8'
6.爬取得到的部分数据。