`

scrapy遇见的坑

 
阅读更多

0.windows安装scrapy

1、安装wheel:
      在控制台输入pip install wheel即可自动完成安装
2、安装lxml:
      到 https://www.lfd.uci.edu/~gohlke/pythonlibs/,往下拉找到 lxml,下载适合自己电脑
      操作系统及python版本的.whl文件。cp27、cp35等代表python版本2.7、3.5,win32代表
      32位windows操作系统,win_amd64代表64位操作系统。
      下载完成后,右键点击文件-属性-安全-对象名称,可以复制到文件地址。复制完成后回到控制
      台,输入“pip install 右键粘贴地址",然后按回车即可完成安装。
3、安装PyOpenssl
      到 https://pypi.python.org/pypi/pyOpenSSL#downloads ,往下拉找到下面文件后下
      载。下载完成后同安装lxml的方法,对该PyOpenssl的whl文件进行安装.
      windows系统下的scrapy框架安装及测试
4、安装Twisted
      到 https://www.lfd.uci.edu/~gohlke/pythonlibs/#Twisted,往下拉找到Twisted,下载
      适合自己电脑操作系统及python版本的.whl文件。同安装lxml的方法将Twisted安装完成。
5、安装Pywin32
      到 https://sourceforge.net/projects/pywin32/files/pywin32/Build 220/,下载适合自
      己电脑操作系统及python版本的文件,下载完成后双击即可开始安装。程序会自动定位
      python的目录,所以不用自己调整安装设置,一直下一步就行了。
6、安装scrapy
      进行完1-5步后,安装scrapy就很简单了,在控制台输入 pip install scrapy即可完成安装。

 

1.No module named win32api

pip install pypiwin32

 

2.文件夹下的文件找不到,或者No module named 'scrapy.pipelines' 或者no module named ×××.items?

    

scrapy项目处于pycharm项目的子项目,所以pycharm找不到items
。我的解决办法是在scrapy项目上右键-》make_directory as
-->sources roo如果项目文件夹变这个颜色就可以了。

 

3.No module named PIL

pip install pillow

 

4.下载图片到本地、并提取本地保存地址

1)在settings.py中打开 ITEM_PIPELINES 的注释,在  ITEM_PIPELINES 中加入
ITEM_PIPELINES = {
   'spider_first.pipelines.SpiderFirstPipeline': 300,
   'scrapy.pipelines.images.ImagesPipeline':5,   #后面的数字代表执行优先级 ,当执行pipeine的时候会按照数字由小到大执行 
}
2)settings.py中加入
IMAGES_URLS_FIELD ="image_url"  #image_url是在items.py中配置的网络爬取得图片地址
#配置保存本地的地址
project_dir=os.path.abspath(os.path.dirname(__file__))  #获取当前爬虫项目的绝对路径
IMAGES_STORE=os.path.join(project_dir,'images')  #组装新的图片路径

 

5.python 安装mysql模块 

windows

pip install mysqlclient

ubuntu

sudo apt-get install libmysqlclent-dev

centos

sudo yum install python-devel mysql-devel

 

 

6. IndentationError: unindent does not match any outer indentation level

方法名开头的时候别用空格,用tab符号

 

7. 连接池的代码

from twisted.enterprise import adbapi
import MySQLdb.cursors


class MysqlTwistedPipline(object):
    #通过连接池的方式
    def __init__(self,dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
       dbparms = dict(
           host=settings["MYSQL_HOST"],
           db=settings["MYSQL_DBNAME"],
           user=settings["MYSQL_USER"],
           passwd=settings["MYSQL_PASSWORD"],
           charset=settings["MYSQL_CHARSET"],
           cursorclass=MySQLdb.cursors.DictCursor,
           use_unicode=settings["MYSQL_USE_UNICODE"],
       )
       dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms)
       return cls(dbpool)

    def process_item(self, item, spider):
        # 使用twisted将mysql插入变成异步执行
        query = self.dbpool.runInteraction(self.do_insert, item)
        query.addErrback(self.handle_error, item, spider)  # 处理异常

    def handle_error(self, failure, item, spider):
        # 处理异步插入的异常
        print(failure)
    def do_insert(self, cursor, item):
            insert_sql = """
                   insert into jobbole(post_url_id,post_url,re_selector,img_url,img_path,zan,shoucang,pinglun,zhengwen,riqi,fenlei) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
               """
            cursor.execute(insert_sql, (
            item["post_url_id"], item["post_url"], item["re_selector"], item["img_url"][0], item["img_path"],
            item["zan"], item["shoucang"], item["pinglun"], item["zhengwen"], item["riqi"], item["fenlei"]))

 

8. 验证码爬虫的解决方案

 

1.如果一个网站有下载验证码的功能,对于我这种还没深入了解机器学习,只能通过人工的方式来进行解决验证码的问题,咱们就进行手动的验证码解析,通过下载图片,然后根据图片手动的输入坐标或者验证码来完成,本质的目的是为了能够完成登录打入敌人的内部,吸收他们里面的养分
2.如果是针对https://www.zhihu.com/captcha.gif?r=1514042860066&type=login&lang=cn
记住要跟登录的用户的获取的通过session来进行
header这边直接github很多 我就不粘贴了

session = requests.session()

response = session.get("https://www.zhihu.com/",headers=header)

图片类别的下载我遇到的坑是
  with open(file_name, 'wb') as f:
        f.write(response.content)
        f.close()
记住如果网页打开直接是图片直接使用response.content 而不是response.text.ecode()
对于一些网站返回的是 unicode json格式看的时候很不爽
解决方案是:
 print(response.text.encode('latin-1').decode('unicode_escape'))

 

9. 出现主键冲突的时候解决ON DUPLICATE KEY UPDATE(只限mysql)

 insert into zhihu_question
                      (zhihu_id,topics,url,title,content,creat_time,update_time,answer_num,comments_num,watch_user_num,click_num,crawl_time,crawl_update_time)
                       VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
                       ON DUPLICATE KEY UPDATE comments_num=VALUES(comments_num),watch_user_num=VALUES(watch_user_num),click_num=VALUES(click_num)

 

10. srcapy items方法很强大通过反向调用的方式就可以动态控制

items

 

class ZhihuQuestionItem(scrapy.Item):
    zhihu_id = scrapy.Field()
    topics = scrapy.Field()
    url = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()
    creat_time = scrapy.Field()
    update_time = scrapy.Field()
    answer_num = scrapy.Field()
    comments_num = scrapy.Field()
    watch_user_num = scrapy.Field()
    click_num = scrapy.Field()

    def get_insert_sql(self):
        insert_sql = """
                      insert into zhihu_question
                      (zhihu_id,topics,url,title,content,creat_time,update_time,answer_num,comments_num,watch_user_num,click_num,crawl_time,crawl_update_time)
                       VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
                       ON DUPLICATE KEY UPDATE comments_num=VALUES(comments_num),watch_user_num=VALUES(watch_user_num),click_num=VALUES(click_num)
                  """
        zhihu_id = self["zhihu_id"][0]
        topics = ",".join(self["topics"])
        url = "".join(self["url"])
        title = "".join(self["title"])
        content = "".join(self["content"])
        creat_time =  datetime.datetime.now().strftime(SQL_DATETIME_FORMAT)
        update_time =  datetime.datetime.now().strftime(SQL_DATETIME_FORMAT)
        answer_num = self["answer_num"][0]
        comments_num = get_nums(self["comments_num"][0])
        watch_user_num =  self["watch_user_num"][0]
        click_num = self["watch_user_num"][1]
        crawl_time = datetime.datetime.now().strftime(SQL_DATETIME_FORMAT)
        crawl_update_time =datetime.datetime.now().strftime(SQL_DATETIME_FORMAT)
        params = (zhihu_id,topics,url,title,content,creat_time,update_time,answer_num,comments_num,watch_user_num,click_num,crawl_time,crawl_update_time)
        return insert_sql,params

 pipelines.py 

class MysqlTwistedZhihuPipline(object):
    #通过连接池的方式
    def __init__(self,dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
       dbparms = dict(
           host=settings["MYSQL_HOST"],
           db=settings["MYSQL_DBNAME"],
           user=settings["MYSQL_USER"],
           passwd=settings["MYSQL_PASSWORD"],
           charset=settings["MYSQL_CHARSET"],
           cursorclass=MySQLdb.cursors.DictCursor,
           use_unicode=settings["MYSQL_USE_UNICODE"],
       )
       dbpool = adbapi.ConnectionPool("MySQLdb", **dbparms)
       return cls(dbpool)

    def process_item(self, item, spider):
        # 使用twisted将mysql插入变成异步执行
        query = self.dbpool.runInteraction(self.do_insert, item)
        query.addErrback(self.handle_error, item, spider)  # 处理异常

    def handle_error(self, failure, item, spider):
        # 处理异步插入的异常
        print(failure)
    def do_insert(self, cursor, item):
            insert_sql,params = item.get_insert_sql()
            cursor.execute(insert_sql, params)

 

 

9. 'dict' object has no attribute 'has_key'  Python3以后删除了has_key()方法

 

if adict.has_key(key1):  

修改为:

if key1 in adict:  

 

10.  爬虫Max retries exceeded with url

 

 页面中的requests不要直接都requests.post 尽量统一requests.session()然后运行完关闭。s.keep_alive = False

s = requests.session()
  s.keep_alive = False

 

11.  阿里云centos安装python3最牛逼的教程(make编译的是深坑啊,建议用yum)

 

sudo yum install epel-release
sudo yum install python34
wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pip3 -V

 

分享到:
评论

相关推荐

    JeffersonQin#gyrojeff.top#Ubuntu下安装Scrapy避坑1

    引言因为最近在做的project nichijou需要写爬虫,遂准备学习一下Scrapy,但是安装中遇到了一些问题。解决下面是官方的安装文档:你可能同时需要安装

    django+scrapy结合

    本篇文章将详细探讨如何将两个强大的Python库——Django和Scrapy结合,以实现通过Django的Web界面控制Scrapy爬虫的运行,并将爬取的数据存入数据库。 首先,让我们了解这两个框架的基本概念。Django是一个高级的Web...

    Scrapy安装文件及其依赖项

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了一个高效且结构化的数据抓取环境。在Windows 7 64位系统上安装Scrapy时,需要确保安装一系列依赖项,这些依赖项对于Scrapy的正常运行至关重要。在这个压缩包文件...

    scrapy 0.22.3

    ### Scrapy 0.22.3:一个强大的网络爬虫框架 #### 一、Scrapy简介 **Scrapy** 是一个用于爬取网站并提取结构化数据的应用框架,广泛应用于数据挖掘、信息处理或历史档案等领域。尽管最初设计是为了进行网页抓取...

    scrapy爬取大文件方法

    Scrapy是一个强大的Python爬虫框架,它为开发者提供了构建网络爬虫所需的各种工具和模块,使得数据抓取和处理变得更加高效。在处理大文件时,Scrapy提供了多种策略和技巧来确保过程的顺利进行。本篇文章将深入探讨...

    scrapy-pyppeteer:Scrapy的Pyppeteer集成

    未维护如果您需要Scrapy的浏览器集成,请考虑使用Scrapy的Pyppeteer集成 该项目提供了一个Scrapy下载处理程序,该处理程序使用执行请求。 它可用于处理需要JavaScript的页面。 该软件包不会干扰常规的Scrapy工作流程...

    scrapy_Python的爬虫框架Scrapy_scrapy_

    Scrapy是Python编程语言中的一款强大且高效的网页抓取框架,专为数据抓取和爬虫项目设计。它提供了一整套工具集,使得开发者能够快速构建起复杂的网络爬虫,处理网页数据并进行分析。在本文中,我们将深入探讨Scrapy...

    用Pyinstaller打包Scrapy项目例子

    然而,Scrapy项目通常是基于命令行启动的,这意味着在不安装Python和Scrapy的情况下无法直接运行。为了在不依赖Python环境的计算机上运行Scrapy项目,我们可以利用Pyinstaller将其打包成exe文件。 首先,确保你已经...

    百度百科爬虫Scrapy

    **Scrapy框架详解** Scrapy是一个强大的Python爬虫框架,专为爬取网站并提取结构化数据而设计。它的设计理念是使爬虫项目易于编写、维护,并提供了多种功能,如中间件、爬取调度器、下载器、Item Pipeline等,以...

    scrapy依赖文件包

    scrapy的所有依赖文件打包(不包含scrapy文件),scrapy文件可以自行安装pip后,用pip安装 命令为:pip install scrapy==1.0.5 scrapy1.0.5中文文档地址 ...

    scrapy-redis-master_scrapy-redis_juzi1122_scrapy_

    Scrapy-Redis是一个基于Scrapy的分布式爬虫框架,它扩展了Scrapy的功能,使其能够处理大规模的网络抓取任务。Scrapy是一个流行的Python爬虫框架,而Scrapy-Redis则是将其与Redis数据库结合,利用Redis作为数据队列,...

    scrapy&request_异步数据爬取_scrapy_

    Scrapy和Request是Python中两种常用的网络爬虫框架,它们都支持异步数据爬取,但各有特点。本文将深入探讨这两个工具在异步爬取中的应用及其优势。 首先,让我们了解一下什么是异步数据爬取。传统的同步爬虫在请求...

    python scrapy电子书开发文档

    ### Python Scrapy 电子书开发文档关键知识点解析 #### 标题:Python Scrapy 电子书开发文档 此文档主要围绕Python Scrapy框架展开,详细介绍了如何使用Scrapy进行网络爬虫开发,包括安装配置、基本概念、内置服务...

    scrapy

    Scrapy是一个强大的Python爬虫框架,专为网络数据抓取和网页解析设计。它提供了高效的数据提取、自动处理、调度和导出功能,是开发者进行Web数据挖掘和自动化任务的强大工具。 Scrapy的核心组件包括: 1. **Engine...

    scrapy-0.24中文文档|中文教程

    Scrapy是一个强大的Python爬虫框架,专为网页数据抓取和结构化数据提取设计。它提供了高效的爬取机制,使得开发者能够快速构建自己的网络爬虫项目。Scrapy 0.24是其早期的一个版本,虽然现在已经有更新的版本发布,...

    精通Scrapy网络爬虫_python_scrapy_

    Scrapy是一个强大的Python爬虫框架,专为高效的数据抓取和复杂的网页解析设计。它提供了丰富的功能,使得开发者能够快速构建自己的网络爬虫项目。在深入理解Scrapy之前,我们首先需要了解Python的基础知识,因为它是...

    scrapy1.1 帮助文档

    ### Scrapy 1.1 帮助文档关键知识点概览 #### 一、Scrapy简介及快速入门 - **Scrapy概述**:Scrapy是一款用于网页抓取的应用框架,可以高效地从网站中提取结构化数据。这些数据可用于各种用途,如数据挖掘、市场...

    Scrapy0.24.1 中文文档

    Scrapy 0.24.1 是一个强大的Python框架,专为网络爬虫设计,用于高效、结构化地抓取互联网数据。这个中文文档详细介绍了Scrapy的各种组件和功能,帮助开发者快速上手并构建自己的爬虫项目。下面将深入探讨Scrapy的...

    一个简单的scrapy示例

    Scrapy是一个强大的Python爬虫框架,它为网络数据抓取提供了高效、易用的解决方案。在本示例中,我们将探讨如何使用Scrapy创建一个简单的爬虫,将抓取的数据保存到JSON文件中。 首先,我们需要安装Scrapy。在命令行...

Global site tag (gtag.js) - Google Analytics