scrapy爬虫基本实现和爬虫思想

今天分享下scrapy爬虫的基本使用方法,scarpy是一个比较成熟稳定的爬虫框架,方便了爬虫设计,有较强的逻辑性。我们以旅游网站为例进行介绍,一方面是旅游网站多,各个网站的适用情况不同,方便我们的学习。最后有网易云评论的一个爬取思路和不同的实现方法。

话不多说,下面是scrapy的框架:

创建scrapy爬虫的命令可以在cmd中输入

scrapy project XXXX

之后创建蜘蛛文件使用

scrapy genspider xxx "xxxx.com"

接着初始化工作就做完了,下面正式开始编写工作,流程如下:

编写item.py编写spider/xxx.py,编写爬虫文件,处理请求和响应,以及提取数据(yield item)编写pipelines.py,编写管道文件,处理spider返回item数据编写settings.py,启动管道组件,以及其他相关设置

执行爬虫

以百度旅游的评论数据为例,其评论数据是按页存储的,这种网站数据比较好爬取

items文件中设置我们需要爬取的字段:

markText = scrapy.Field()

在蜘蛛文件中设置爬取域、初始url、步长等参数

allowed_domains = [‘baidu.com‘]baseURL="https://lvyou.baidu.com/shenzhen/remark/?rn=15&pn="endword="&style=hot#remark-container"offset=0start_urls = [baseURL+str(offset)+endword]

在parse函数中获取到评论的node。这里推荐xpath,语法简单还有对应的工具,方便查找,还可以用正则(万能查找方式),css选择器等等等等:

node_list=response.xpath("//div[@class=‘remark-item clearfix‘]//div[@class=‘ri-remarktxt‘]")for node in node_list:  item=xxxItem()

item[‘markText‘]=str(node.xpath("string(.)").extract()[0])
yield item
if self.offset<300:#爬取数量    self.offset+=15    url=self.baseURL+str(self.offset)+self.endword    yield scrapy.Request(url,callback=self.parse)

管道文件处理爬取到的数据,这里以json存储,也可以保存到mongodb、sqlite等数据库,量不大,也不需要管理就没必要了:

def __init__(self):    self.f=open("shenzhen.json","w")

def process_item(self, item, spider):    content = json.dumps(dict(item), ensure_ascii=False) + ",\n"    self.f.write(content)    return item

def close_spider(self,spider):    self.f.close()

最后要设置下settings文件,启动管道组件,很多人都会忘掉这种细节。最后可以添加个main.py文件作为爬虫入口:

from scrapy import cmdline

cmdline.execute(‘scrapy crawl baidu‘.split())

下面是爬取结果的一个展示:

进一步的词汇分析,这里用的jieba进行的分词,用wordcloud库进行词云构建,频率统计如下:

注意

如果是去哪儿这种反扒机制比较强的网站,爬取次数过多会封锁ip,我们需要进行比如代理ip的设置、useraget的设置、设置时间间隔、甚至验证码的识别等,具体可看这篇文章:https://www.jianshu.com/p/afd873a42b2d,这里给出一个设置代理ip的方法:

from bs4 import BeautifulSoupimport requestsimport random#随机生成useragentfrom fake_useragent import UserAgentimport random

ua = UserAgent()print(ua.random)#print(random.random())headers={    "‘User-Agent‘:"+ua.random}

def getHTMLText(url, proxies):    try:        r = requests.get(url, proxies=proxies)        r.raise_for_status()        r.encoding = r.apparent_encoding    except BaseException:        return 0    else:        return r.text

#从代理ip网站获取代理ip列表函数,并检测可用性,返回ip列表def get_ip_list(url):    web_data = requests.get(url, headers)    soup = BeautifulSoup(web_data.text, ‘html‘)    ips = soup.find_all(‘tr‘)    ip_list = []    for i in range(1, len(ips)):        ip_info = ips[i]        tds = ip_info.find_all(‘td‘)        ip_list.append(tds[1].text + ‘:‘ + tds[2].text)# 检测ip可用性,移除不可用ip:(这里其实总会出问题,你移除的ip可能只是暂时不能用,剩下的ip使用一次后可能之后也未必能用)    for ip in ip_list:        try:            proxy_host = "https://" + ip            proxy_temp = {"https": proxy_host}            res = urllib.urlopen(url, proxies=proxy_temp).read()        except Exception as e:            ip_list.remove(ip)            continue    return ip_list

#从ip池中随机获取ip列表def get_random_ip(ip_list):    proxy_list = []    for ip in ip_list:        proxy_list.append(‘http://‘ + ip)    proxy_ip = random.choice(proxy_list)    proxies = {‘http‘: proxy_ip}    return proxies

#调用代理if __name__ == ‘__main__‘:    url = ‘http://www.xicidaili.com/nn/‘    ip_list = get_ip_list(url)    proxies = get_random_ip(ip_list)    print(proxies)

不过爬虫不是一个一招鲜吃遍天的工具,需要我们根据具体的网站灵活的选用合适的方法

关于网易云评论这种没有页码信息的网站,是通过浏览器接收包再由浏览器动态渲染出来的,这个问题知乎有大神回答了:https://www.zhihu.com/question/47765646

好了,今天的介绍就是这些,不是要给现成的代码,而是重点讲一下爬虫的基本思想分享给大家,希望有帮助。

原文地址:https://www.cnblogs.com/Leo-Do/p/10304585.html

时间: 2024-12-17 10:57:00

scrapy爬虫基本实现和爬虫思想的相关文章

第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—

第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-编写spiders爬虫文件循环抓取内容- 编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield Request() parse.urljoin()方法,是urllib库下的方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接 # -*- coding:

使用scrapy crawl name启动一个爬虫时出现的问题

使用scrapy crawl name启动一个爬虫时出现的问题,我的项目名字叫做 "spider_city_58",代码如下: from scrapy import cmdline cmdline.execute("scrapy crawl spider_city_58".split()) 来启动一个爬虫,却出现了如下错误 ImportError: No module named win32api 一开始尝试了网上其他的方法,就是去下载"pywin32-2

Scrapy爬虫框架下执行爬虫的方法

在使用Scrapy框架进行爬虫时,执行爬虫文件的方法是 scrapy crawl xxx ,其中 xxx 是爬虫文件名. 但是,当我们在建立了多个文件时,使用上面的命令时会比较繁琐麻烦,我们就可以使用下述方法同时完成爬虫文件的执行. 第一种,在scrapy框架下建立一个运行文件,如 run.py ,在文件中建立一个列表,列表为爬虫的执行命令,最后通过循环执行 execute() 函数完成执行.执行时使用 python run.py 命令即可.如下面的代码所示 from scrapy.cmdlin

基于Scrapy框架的Python新闻爬虫

概述 该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 详细 代码下载:http://www.demodashi.com/demo/13933.html 一.开发背景 Python作为数据处理方面的一把好手,近年来的热度不断增长.网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合适不过了. Scrapy是由Python语言开发的一

Python爬虫进阶一之爬虫框架概述

综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一些优秀的框架,先把这些框架用熟,可以确保能够应付一些基本的爬虫任务,也就是所谓的解决温饱问题,然后再深入学习它的源码等知识,进一步强化. 就个人而言,前一种方法其实就是自己动手造轮子,前人其实已经有了一些比较好的框架,可以直接拿来用,但是为了自己能够研究得更加深入和对爬虫有更全面的了解,自己动手去多做.

开发网络爬虫应该怎样选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch.Crawler4j.WebMagic.scrapy.WebCollector还是其他的?这里按照我的经验随便扯淡一下: 上面说的爬虫,基本可以分3类: 1.分布式爬虫:Nutch 2.JAVA单机爬虫:Crawler4j.WebMagic.WebCollector 3. 非JAVA单机爬虫:scrapy 第一类:分布式爬虫         爬虫使用分布式,主要是解决两个问题: 1)海量URL管理 2)网速 现在比较流行的分布式爬虫,是Apache的Nut

开发网络爬虫应该如何选择爬虫框架?

有些人问,开发网络爬虫应该选择Nutch.Crawler4j.WebMagic.scrapy.WebCollector还是其它的?这里依照我的经验随便扯淡一下: 上面说的爬虫,基本能够分3类: 1.分布式爬虫:Nutch 2.JAVA单机爬虫:Crawler4j.WebMagic.WebCollector 3. 非JAVA单机爬虫:scrapy 第一类:分布式爬虫         爬虫使用分布式.主要是解决两个问题: 1)海量URL管理 2)网速 如今比較流行的分布式爬虫,是Apache的Nut

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider)

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔... Day 1小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库.这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(1.1.1.1)这个用户,并且 useragent 还是 JavaClient1.6 ,基于这两点判断非人类后直接在Nginx 服务器上封杀.

Python网络爬虫2:迷你爬虫架构

摘要:从零开始写爬虫,初学者的速成指南! 封面: 关注+转发此文然后我评论留下"架构"即可领取框架的完整程序(随意写的,仅供参考哈),也欢迎大家和我一起交流学习Python,共同成长 介绍 大家好!回顾上一期,我们在介绍了爬虫的基本概念之后,就利用各种工具横冲直撞的完成了一个小爬虫,目的就是猛.糙.快,方便初学者上手,建立信心.对于有一定基础的读者,请不要着急,以后我们会学习主流的开源框架,打造出一个强大专业的爬虫系统!不过在此之前,要继续打好基础,本期我们先介绍爬虫的种类,然后选取最

转 Python爬虫入门二之爬虫基础了解

静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以及百度搜索框,这个过程其实就是用户输入网址之后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器 HTML.JS.CSS 等文件,浏览器解析出来,用户便可以看到形形色色的图片了. 因此,用户看到的网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容