c爬虫抓取网页数据(关于item修改三项内容的一些问题教程引入刚刚写好的item)
优采云 发布时间: 2022-03-21 23:43c爬虫抓取网页数据(关于item修改三项内容的一些问题教程引入刚刚写好的item)
1.创建项目
打开终端进入(建议放到合适的路径,默认是C盘)
2.修改设置
修改三项,第一项是不遵循robot协议,第二项是下载gap,因为下面的程序需要下载多个页面,所以需要给gap(不给也可以,但是很容易待检测),第三个是请求头,添加一个User-Agent,第四个是开一个管道ROBOTSTXT_OBEY=False
DOWNLOAD_DELAY=1DEFAULT_REQUEST_HEADERS={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-语言':'en','User-Agent':'Mozilla/5.0(WindowsNT6.2;WOW64)AppleWebKit/537.36(KHTML,likeGecko )Chrome/27.0.1453.94Safari/537.36'}ITEM_PIPELINES={'TXmovies.pipelines.TxmoviesPipeline':300,}
3.确认要提取的数据,
item item 定义要提取的内容(定义数据结构)。比如我提取的内容是电影名和电影描述,所以我创建了两个变量。Field方法的实际做法是创建一个字典,给字典添加一个新的值,暂时不赋值,等数据提取出来再赋值。下面的item结构可以表示为:{'name':'','description':''}。#-*-coding:utf-8-*-#Defineherethemodelsforyourscrapeditems##Seedocumentationin:#(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()name=scrapy.Field()description=scrapy. 场地()
4.写一个爬虫
我们要写的部分是parse方法的内容,重点是xpath怎么写,XPATH教程介绍了刚才写的item,刚才说item中创建的变量是字典的key值,可以直接赋值。赋值后,交给流水线处理。简单说一下这段代码的思路,首先腾讯视频的url是给我们注意偏移量的,第一页的偏移量为0,第二页的偏移量为30,列推送按顺序。在程序中,此项用于控制第一页的抓取,但也需要给出一个范围。不能无限,否则会报错。你可以去看看腾讯总共有多少个视频页,也可以写一个异常捕获机制。捕获到请求错误时退出。我这里只是演示,所以我只给了120,也就是4页。收益计划中有两个收益。我更喜欢称之为中断。当然,中断只发生在 CPU 中。它的功能是转移控制权。在这个程序中,我们封装了item数据后,调用yield来传递控制权。把它交给管道,管道处理完后,返回并返回程序。这是对第一次收益率的解释。第二个产量有点复杂。本程序使用回调机制,即回调。回调的对象是 parse,也就是当前方法。通过不断的回调,程序会陷入循环。如果程序不加任何条件,就会陷入死循环。如果我在这个程序中删除 if ,这将是一个无限循环。yieldcrapy.Request(url=url,callback=self.parse)xpath 另外需要注意的是如何提取xpathl中的数据,我们有四种写法,第一种获取selector选择器,也就是original data ,其中有一些我们不使用的东西。第二个 extract() 将选择器序列号转换为字符串。第三个和第四个一样,获取字符串中的第一个数据,也就是我们想要的数据。将选择器序列号转换为字符串。第三个和第四个一样,获取字符串中的第一个数据,也就是我们想要的数据。将选择器序列号转换为字符串。第三个和第四个一样,获取字符串中的第一个数据,也就是我们想要的数据。
items['name']=i.xpath('./a/@title')[0]items['name']=i.xpath('./a/@title').extract()items[' name']=i.xpath('./a/@title').extract_first()items['name']=i.xpath('./a/@title').get()
#-*-coding:utf-8-*-importscrapyfrom..itemsimportTxmoviesItemclassTxmsSpider(scrapy.Spider):name='txms'allowed_domains=['']start_urls=['#39;]offset=0defparse(self,response): items=TxmoviesItem()lists=response.xpath('//div[@class="list_item"]')foriinlists:items['name']=i.xpath('./a/@title').get( )items['description']=i.xpath('./div/div/@title').get()yielditemsifself.offset 5. 到管道输出管道
提取的数据可以进行处理,例如存储在数据库中。我们只在这里输出。#-*-coding:utf-8-*-#Defineyouritempipelinehere##Don'tforgettoaddyourpipelinetotheITEM_PIPELINESsetting#See:
classTxmoviesPipeline(object):defprocess_item(self,item,spider):print(item)returnitem
6.run,执行项目
从scrapy导入命令行
cmdline.execute('scrapycrawltxms'.split())
7.测试结果白管输出结果
,红色调试信息8.流程梳理新建项目-》进入项目-》新建爬虫文件-》指定要抓取的内容,写入item-》编写爬虫程序,爬取数据-》交给管道处理数据-“调整全局配置设置-”执行爬虫程序,可以通过终端完成,也可以在程序中完成
8.处理中
新建项目-》进入项目-》新建爬虫文件-》明确要抓取的内容,编写item-》编写爬虫程序,爬取数据-》交给管道处理数据-》调整全局配置设置-》执行爬虫程序, 可以通过终端或者在程序中编写运行程序
9.加速:
多线程爬取如果实现了上面的实验,不难发现爬取速度很慢。根本原因是它是按顺序执行的。从结果可以看出,上一页的内容总是被删除。输出,然后输出以下内容。它不适合处理大量数据。一个好的方法是使用多线程方法。这里的多线程是基于方法的多线程,而不是通过创建一个 Thread 对象。请求被传递给调度程序。我们通过重写start_requests方法来实现我们的想法(这个方法的源码在__init__.py下,有兴趣的可以看看)
#-*-coding:utf-8-*-importscrapyfrom..itemsim
portTxmoviesItemclassTxmsSpider(scrapy.Spider):name='txms'allowed_domains=['']url='{}&pagesize=30'offset=0defstart_requests(self):
范围(0,121,30):
url=self.url.format(i)yieldscrapy.Request(url=url,callback=self.parse)defparse(self,response):items=TxmoviesItem()lists=response.xpath('//div[@class= "list_item"]')foriinlists:
items['name']=i.xpath('./a/@title').get() items['description']=i.xpath('./div/div/@title').get()产量项目