直接去慕课网看视频的话,下面有链接。如果是遇到问题的话,开始下面应该有答案。这是一个入门的练习记录,仅作为日后复习以及如果有幸能对其他人有所帮助的话(本人菜鸡一个)

慕课网学习链接
项目代码文件


开始

首先确保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 慕课网