直接去慕课网看视频的话,下面有链接。如果是遇到问题的话,开始下面应该有答案。这是一个入门的练习记录,仅作为日后复习以及如果有幸能对其他人有所帮助的话(本人菜鸡一个)
慕课网学习链接
项目代码文件
开始
首先确保scrapy的安装,
pip install scrapy
找到博客教程,去这个网站下扩展包。缺哪个包下哪个,比如我缺了twisted。
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
下载之前要先查看自己的环境是什么,如下
切换目录到下载好的文件目录,
pip install Twisted-18.9.0-cp37-cp37m-win_amd64.whl
可以之后,然后再重新pip install scrapy,全部成功安装
下次安装什么东西,要注意看最后面是error还是successfully
1.创建项目
scrapy startproject xxx
2.生成spider
进入项目路径下spiders文件夹
scrapy genspider xxx_spider movie.douban
3.配置设置
进入setting.py先定义好自己的user_agent
4.运行测试
写一个main.py来代替cmd
from scrapy import cmdline
cmdline.execute("scrapy crawl douban250".split())
5.报错
缺少win32 api
pip install pywin32
DNS lookup failed: no results for hostname lookup: https
- 生成spider的时候,后面的url,在spider里会自动添加http,去掉就正常了
- 网络无连接,检查网络
测试
继续
1.xpath
进入页面查看数据所在位置,在浏览器(Chrome)安装一个xpath工具
XPath Helper
定位语法规则:
-
定位到类名为xxx的div
//div[@class="xxx"]
-
定位下一级
//xxx
-
定位href
//span[@class="next"]//a/@href
-
p标签,获取第一段…
//p[1]
-
获取文本内容
/text()
2.使用xpath,获取数据
在页面上使用xpath工具,找到数据列表位置,复制写好的xpath,进入spider
- parse():默认解析方法
- 获取对象列表,然后开始循环列表
list = response.xpath("//xx//xxx")
for i in list:
pass
- 实例化item
from ..items import *
items = XXXItem()
- 获取
# 获取全部,存为列表
item["xx"]=i.xpath(".//xxxx//x/text()").extract()
# 获取列表第一个[0],字符串
item["xx"]=i.xpath(".//xxxx//x/text()").extract_first()
3.数据处理
获取到需要的数据之后,在for循环外,yield 一整个items对象
yield items
会将其交给pipelines,管道,用于待会保存数据等操作
下一页
在页面上定位到下一页的a标签,获取它的href,然后同样yield,这里理解,应该是交给队列了。
这里忘记写回调函数,但是似乎也不妨碍所有数据的获取
next_link = response.xpath('//span[@class="next"]//a/@href').extract_first()
if next_link: # 如果有内容
next_link = scrapy.Request("https://movie.douban/top250"+next_link, callback=self.parse)
yield next_link
保存数据
scrapy crawl douban250 -o xxx.json
scrapy crawl douban250 -o xxx.csv
用excel打开csv可能会乱码,用编辑器打开保存为utf-8 bom格式即可
保存到数据库
很久没用的mongodb
控制台输入mongod,报错,找不到/data/db
mongod --dbpath C:\Program Files\MongoDB\Server\4.0\data\db
报错:找不到
原因:路径不能有空格
切换到目录下再来一次,可以了,访问localhost:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.
还不是很熟练。
现在在c盘下新建了data/db文件夹,
cmd直接输入mongod打开,然后使用navicat连接
准备就绪
mongodb准备就绪之后就可以在setting里开启pipelines(即取消掉注释)
然后去pipelines创建连接,写入数据
打开pipelines.py先导入pymongo
import pymongo
然后在预定义好的类下,定义多一个init方法
定义主机、端口、库名、集合名
def __init__(self):
host = "127.0.0.1"
port = 27017
dbname = "test"
collection_name = "test1"
client = pymongo.MongoClient(host,port)
mydb = client[dbname]
self.post = mydb[collection_name]
再在process_item方法中把item转换为字典,然后insert进mongodb,结果ok
def process_item(self, item, spider):
data = dict(item)
self.post.insert(data)
return item
到此基本完成,然后是善后部分
4.伪装
- 代理ip:在middleware.py最后加入自定义中间件(没有云主机,所以没有测试)
# 自定义中间件:ip代理
class my_ip_proxy(object):
def process_request(self, request, spider):
# 代理主机和端口
request.meta['proxy'] = 'xxxxxx:xxxxxx'
# 主机用户名密码
proxy_name_pwd = b'xxxxxx:xxxxxx'
# 加密用户名密码
encode_info = base64.b64encode(proxy_name_pwd)
request.headers['Proxy-Authorization'] = 'Basic ' + encode_info.decode()
# 完成之后要到setting中找到middleware添加
- 随机agent:同上,定义中间件,在网上搜索scrapy user agent,找一个列表
USER_AGENT_LIST = [
'MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23',
'Opera/9.20 (Macintosh; Intel Mac OS X; U; en)',
'Opera/9.0 (Macintosh; PPC Mac OS X; U; en)',
'iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)',
'Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)',
'iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0',
'Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)',
'Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)'
]
然后定义随机选择
agent = random.choice(USER_AGENT_LIST)
request.headers['User_Agent'] = agent
运行main,可见中间件有被使用
pycharm 中 Alt + Enter,可以快速提示并导入模块
结束
其实如果有人不幸搜到这一篇博客,还不如直接去慕课网看视频,看一点然后实现一点,自己整理自己出现的问题,作为入门练习很好,其中可以举一反三,然后再自己加入自己的想法的话,就更好了。理解了scrapy框架的基本流程和注意事项的话,基于此的简单爬虫,相信谁都能轻易完成。然鹅,小学生已经在学python了,我这个本科毕业生,还在转型python的路上。只能加油了
更多推荐
scrapy入门与实践 (python3.7) from 慕课网
发布评论