简单的Scrapy数据爬虫
数据爬取展示:
环境准备:
- Python 3+版本
- Pycharm(可以没有)
- Scrapy环境
Scrapy环境安装问题
//cmd中输入即可(一般在windows系统都会出问题)
pip install scrapy
Scrapy环境安装问题
-
缺少Scrapy的依赖包问题
一般缺少parsel, w3lib, pyOpenSSL,cryptography的whl文件,按顺序进行pip install XXX。如果在线安装不了,去官网进行下载。离线进行安装 pip install XXXX.whl
-
pip提醒没有此命令
方法一:进入Python安装目录中,找到Scripts文件夹中进行输入cmd命令行。(指标不治本)
在电脑中环境变量中path中配置Scripts路径(治本之策)
-
pip提醒升级问题
解决方法:
python -m pip install -U --force-reinstall pip
python -m pip install --upgrade pip仍然更新pip版本失败,用easy_install命令解决问题
-
安装Scrapy安装提醒Time out
解决办法离线安装Scrapy的whl文件。
https://pan.baidu.com/s/1cMlFdSqprMUrxx81xu1NzQ
提取码:h7rw
Xpath基础
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
花个五分钟在W3C上看看就知道了,不是很难。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
方便在网页上进行XPath的编写,Google浏览器有个很好的插件——XPath Helper
网盘地址:https://pan.baidu.com/s/16ourySoo45BpbfDRjUT32w
提取码:aps7
直接利用这个插件在网页端可以看到XPath获取的信息
eg:(当当网——获取图书信息XPath)//div[@id="search_nature_rg"]/ul/li/p[@class="detail"]
Scrapy代码编写
在新建的文件夹下,cmd命令中输入
scrapy startproject XXXSpider
一般的命名规范是XXXSpider,文件名+Spider
创建爬虫
scrapy genspider 爬虫名字 网站域名
在cfg文件目录下执行命
<u>爬虫名字不能和项目名字重名</u>
网站域名:baidu.com google.com
Setting文件的修改部分:
1、ROBOTSTXT_OBEY规则设置为False(不用遵守网站的robot文件,如果遵守可能什么都爬不下来)
2、添加User-Agent(Setting文件DEFAULT_REQUEST_HEADERS取消注释)
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'
依照以上两步操作,可以得到的文件目录如下:
在新增的爬虫文件中编写代码:(爬取的是博雅地名网)
import scrapy
class GazetterSpider(scrapy.Spider):
name = 'gazetter'
allowed_domains = ['tcmap.com.cn']
start_urls = ['http://www.tcmap.com.cn/jiangsu/']
//未遍历
def parse(self, response):
# selectors = response.xpath('');
city_name = response.xpath('//tr[@bgcolor="#f8f8f8"]/td/strong/a/text()').get()
population = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[2]/text()').get()
area = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[3]/text()').get()
code = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[4]/text()').get()
administrative_division = response.xpath('//tr[@bgcolor="#f8f8f8"]/td[6]/a/text()').get()
detail = response.xpath('//td[@valign="top"][2]/text()').get()
items = {
'cityName': city_name,
'population': population,
'area': area,
'code': code,
'administrative_division': administrative_division,
'detail': detail
}
yield items
运行程序:
scrapy crawl XXXX -o xxx.json
Scrapy输出文件有四种格式——.json .csv等
编码问题
在Setting文件中添加
FEED_EXPORT_ENCODING='UTF-8'
否则输出的文件是Unicode格式,需要转码。