关于疫苗的python爬虫脚本,主要爬新华网。
源码地址查看
Github brokge / vaccine-scrapy
1. 需要环境
- python 3.5.2
- scrapy 1.5.2
- conda 4.6.11 或者 pip3
- pycryptodome
- pymysql
如果碰到 兼容性问题
最好的方式,是通过 conda 安装所需要的环境变量,记得安装之后重启下系统
conda install -c conda-forge scrapy
当然也可以通过 pip3 来安装
pip3 --default-timeout=100 install scrapy
pip3 install pycryptodome
pip3 install pymysql
2. 运行
scrapy crawl spiderNews
3. 文件目录说明
通过 tree 命令查看目录结构
.
── README.md
├── scrapy.cfg
└── vaccine
├── README.md
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ ├── items.cpython-37.pyc
│ ├── pipelines.cpython-37.pyc
│ └── settings.cpython-37.pyc
├── dbsql.sql
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
├── spiders
│ ├── VaccineNewsSpider.py
│ ├── __init__.py
│ └── __pycache__
│ ├── VaccineNewsSpider.cpython-37.pyc
│ └── __init__.cpython-37.pyc
└── vaccine_name.txt
dbsql.sql ---数据表结构脚本
vaccine_name.txt ---需要查询的关键字配置文件
VaccineNewsSpider.py --- 爬虫执行文件
-
pipelines.py --- 配置 通道的位置,根据自己情况调整
# 链接数据的配置 self.connect = pymysql.connect( # 数据库地址 host="127.0.0.1", port=3306, db="dbcontent", user='yusuzi', passwd='yusuzi', charset='utf8', use_unicode=True )
4. 执行效果截图
5. 核心逻辑
在 VaccineNewsSpider.py 文件中,主要逻辑流程如下
- 构造 url请求地址,
- 填充 关键字
- 请求 url
- 解析 返回数据
- 根据请求url 生成 md5 去重。
- 写入数据哭。
5.1 构造请求并解析返回数据
class VaccineNewsSpider(scrapy.Spider):
name = "spiderNews"
url_format = "http://so.news.cn/getNews?keyword=%s&curPage=%s&sortField=0&searchFields=1&lang=cn"
def start_requests(self):
keywords = set()
try:
f = open('vaccine/vaccine_name.txt', 'r')
for line in f.readlines():
line = line.strip('\n') # 去除换行符号
keywords.add(line)
finally:
if f:
f.close()
url_format: 根据自己不同的目标网址,进行构造请求url
def parse_json(self, response):
print("aa")
print(response.body)
newJson = json.loads(response.body)
print(newJson['code'])
newContent = newJson['content']
results = newContent['results']
pageSize = newContent['pageCount']
curPage = newContent['curPage']
keyWord = newContent['keyword']
newSets = set()
for result in results:
url = result['url']
if 'm.xinhuanet.com' in url and result['des']:
html_remove = re.compile(r'<[^>]+>', re.S) # 构建匹配模式
# dd = dr.sub('', string) # 去除html标签
title = html_remove.sub('', result['title'])
print("title"+title)
vaccineNewsItem = VaccineNewsItem()
vaccineNewsItem['title'] = title.lstrip()
vaccineNewsItem['from_url'] = url
# result['sitename']
vaccineNewsItem['from_source'] = '新华网'
vaccineNewsItem['summary'] = result['des'].lstrip()
vaccineNewsItem['create_date'] = result['pubtime']
vaccineNewsItem['md5'] = self.md5_str(str=title)
vaccineNewsItem['keyword'] = keyWord
newSets.add(vaccineNewsItem)
yield vaccineNewsItem
if curPage < pageSize:
curPage = curPage+1
url = self.url_format % (keyWord, curPage)
print(url)
yield scrapy.Request(url, callback=self.parse_json)
def md5_str(self, str):
m = MD5.new()
m.update(str.encode("utf-8"))
return m.hexdigest()
以上代码为请求 url 并解析请求数据。
5.2 写入数据库
首先:VaccinePipeline.py 中配置通道相关信息,比如数据库链接配置,数据实体映射配置,插入数据执行sql配置等。
其次:setting.py 中 激活通道,并配置优先级
ITEM_PIPELINES = {
'vaccine.pipelines.MySQLPipeLine': 300,
}
通过以上基本就可以跑起来了。运行中有什么问题,欢迎反馈