html5/css教程

javascript教程

asp教程

php教程

jsp教程

C#/.NET教程

Python教程

网络营销

建站经验

点击排行

python爬虫开发技巧,值得收藏

来源:中文源码网    浏览:650 次    日期:2024-04-21 17:24:03

解析

xpath提取所有节点文本

  • 我左青龙,右白虎,
      上朱雀,
    • 下玄武。
    老牛在当中,
    龙头在胸口。

使用xpath的string(.)

  • #!/usr/bin/env python
  • # -*- coding: utf-8 -*-
  • from scrapy.selector import Selector
  • text = '
    我左青龙,右白虎,
      上朱雀,
    • 下玄武。
    老牛在当中,
    龙头在胸口。
    '
  • s = Selector(text=text)
  • data = s.xpath('//div[@id="test3"]')
  • info = data.xpath('string(.)').extract()[0]
  • print(info)
  • # output: 我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。

如何解决详情页面元素改变

这个问题是这样产生的,在很多PC站,比如链家,这个页面有这些字段A,但是下个页面这个字段A没了,取而代之的是字段B,在xpath定位时就失效了。这个问题很常见,大体思路是这样的。

  1. 创建一个包含所有字段的dict: data = {}.fromkeys(('url', 'price', 'address'))
  2. 然后根据网页中是否有字段来取值,例如,有’url’就取对应的value,没有则为空
  3. 这样就可以完美解决匹配不全问题
多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

Scrapy 相关

文件编写

逻辑文件和解析部分分开写,匹配文件目录是utils/parse/,爬虫文件目录是spiders/

Scrapy 中文乱码

在 setting 文件中设置:FEED_EXPORT_ENCODING = 'utf-8'

Scrapy 使用Mongo

pipelines.py

  1. 首先我们要从settings文件中读取数据的地址、端口、数据库名称。
  2. 拿到数据库的基本信息后进行连接。
  3. 将数据写入数据库(update制定唯一键)
  4. 关闭数据库

注意:只有打开和关闭是只执行一次,而写入操作会根据具体的写入次数而定。

Redis 无需关闭

  • import pymongo
  • class MongoDBPipeline(object):
  • """
  • 1、连接数据库操作
  • """
  • def __init__(self,mongourl,mongoport,mongodb):
  • '''
  • 初始化mongodb数据的url、端口号、数据库名称
  • :param mongourl:
  • :param mongoport:
  • :param mongodb:
  • '''
  • self.mongourl = mongourl
  • self.mongoport = mongoport
  • self.mongodb = mongodb
  • @classmethod
  • def from_crawler(cls,crawler):
  • """
  • 1、读取settings里面的mongodb数据的url、port、DB。
  • :param crawler:
  • :return:
  • """
  • return cls(
  • mongourl = crawler.settings.get("MONGO_URL"),
  • mongoport = crawler.settings.get("MONGO_PORT"),
  • mongodb = crawler.settings.get("MONGO_DB")
  • )
  • def open_spider(self,spider):
  • '''
  • 1、连接mongodb数据
  • :param spider:
  • :return:
  • '''
  • self.client = pymongo.MongoClient(self.mongourl,self.mongoport)
  • self.db = self.client[self.mongodb]
  • def process_item(self,item,spider):
  • '''
  • 1、将数据写入数据库
  • :param item:
  • :param spider:
  • :return:
  • '''
  • name = item.__class__.__name__
  • # self.db[name].insert(dict(item))
  • self.db['user'].update({'url_token':item['url_token']},{'$set':item},True)
  • return item
  • def close_spider(self,spider):
  • '''
  • 1、关闭数据库连接
  • :param spider:
  • :return:
  • '''
  • self.client.close()

scrapy图片下载

  • import scrapy
  • from scrapy.pipelines.images import ImagesPipeline
  • from scrapy.exceptions import DropItem
  • class MyImagesPipeline(ImagesPipeline):
  • def get_media_requests(self, item, info):
  • for image_url in item['image_urls']:
  • yield scrapy.Request(image_url)
  • def item_completed(self, results, item, info):
  • image_paths = [x['path'] for ok, x in results if ok]
  • if not image_paths:
  • raise DropItem("Item contains no images")
  • item['image_paths'] = image_paths
  • return item

scrapy 暂停爬虫

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

scrapy_redis 分布式

使用队列与去重即可完成分布式需求,需要注意的是 Redis 格式,默认采用的是 list, 可以在 settings.py 文件中设置 REDIS_START_URLS_AS_SET = True,使用 Redis的 set类型(去重种子链接)

安装

超时问题

自定义超时时间

sudo pip3 --default-timeout=100 install -U scrapy

或者 使用其他源

sudo pip3 install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

权限问题

安装某模块时,报错:PermissionError: [WinError 5] 拒绝访问。: 'c:\program files\python35\Lib\sit e-packages\lxml'

最简单方法:pip install --user lxml

Pycharm 相关

.gitignore 文件

安装插件: Preferences > Plugins > Browse repositories... > Search for ".ignore" > Install Plugin

然后就可以很方便的添加到 .gitignore

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

显示函数

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

点击 Show Members,查看目录,会显示相应的类和函数

激活码

  1. http://idea.liyang.io
  2. http://xidea.online

数据

Mongo导出命令

λ mongoexport -d test -c set --type=csv -f name,age -o set.csv

λ mongoexport -h 10.10.10.11 -d test -c test --type=csv -f url,id,title -o data.csv

其他

requirements.txt 文件

小提示:使用 pigar 可以一键生成 requirements.txt 文件

Installation:pip install pigar

Usage:pigar

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

好了,今天先写这点,以后再补上。

文末给大家推荐一个小小的干货:推荐3个适合新人上手的Python项目,10分钟现学现用!

1:爬取网站美图

爬取图片是最常见的爬虫入门项目,不复杂却能很好地熟悉Python语法、掌握爬虫思路。当然有两个点要注意:一、不要侵犯版权,二、要注意营养。

?思路流程

第一步:获取网址的response,分页内容,解析后提取图集的地址。

第二步:获取网址的response,图集分页,解析后提取图片的下载地址。

第三步:下载图片(也就是获取二进制内容,然后在本地复刻一份)。

?部分代码

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

?运行结果

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

2:爬取微博数据

爬虫的最大功能之一就是整合数据,能弄到更全面的信息,真正做好大数据的分析,在这个数据说话的年代,影响是决定性的。(注意别侵权)

?思路流程

1、利用chrome浏览器,获取自己的cookie。

2、获取你要爬取的用户的微博User_id

3、将获得的两项内容填入到weibo.py中,替换代码中的YOUR_USER_ID和#YOUR_COOKIE,运行代码。

?部分代码

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

用wordcloud等软件生成词云,它会根据信息的频率、权重按比列显示关键字的字体大小。

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

3:爬取王者荣耀全套皮肤

怎么获取全套皮肤?用钱买,或者用爬虫爬取下来~虽然后者不能穿。这个案例稍微复杂一点,但是一个非常值得学习的项目。

?思路流程

首先进入所有英雄列表,你会看到下图

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

在这个网页中包含了所有的英雄名称。点击其中一个英雄例如“百里守约”,进去后如下图:

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

△网址为https://pvp.qq.com/web201605/herodetail/196.shtml

网址中196.shtml以前的字符都是不变的,变化的只是196.shtml。而196是“百里守约”所对应的数字,要想爬取图片就应该进入每个英雄图片所在的网址,而网址的关键就是对应的数字。那么这些数字怎么找呢?

在所有英雄列表中,打开浏览器的开发者工具,刷新,找到一个json格式的文件,如图所示:

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

这时就会看到所有英雄对应的数字了。在上图所示的Headers中可以找到该json文件对应的网址形式。将其导入Python,把这些数字提取出来,然后模拟出所有英雄的网址即可

?小节代码:

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

?下载图片

现在可以进入所有英雄的网址并爬取网址下的图片了。进入一个英雄的网址,打开开发者工具,在NetWork下刷新并找到英雄的皮肤图片。如图所示:

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

然后在Headers中查看该图片的网址。会发现皮肤图片是有规律的。我们可以用这样的方式来模拟图片网址

'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(v)+'/'+str(v)+'-bigskin-'+str(u)+'.jpg',

在该网址中只有str(v)与str(u)是改变的(str( )是Python中的一个函数),str(v)是英雄对应的数字,str(u)只是图片编号,例如第一个图片就是1,第二个就是2,第三个……而一个英雄的皮肤应该不会超过12个(可以将这个值调到20等)。接着就是下载了。

?下载代码:

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

执行完上面的代码后只需要执行main函数就行了

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

爬取下来的图片是这样,每个文件夹里面是该英雄对应的图片,如下图:

多年开发工程师做的爬虫笔记,抓紧时间速度收藏!

好了,今天的文章就给大家分享到这里了,希望对正在入门学习Python爬虫或者正在学习Python爬虫的你有所帮助

精彩推荐