前言
学校的实训要求做一个大数据项目,我们的任务是一个斗鱼流量大数据平台。我先爬一下试试。初学Python和scrapy,写的代码有很多问题都没搞定,但是今天解决了一个难题,所以分享一下经历。
对网站的分析
到斗鱼的直播间页面https://www.douyu.com/directory/all,按F12打开开发人员工具,找到我需要的数据,即“在线直播”下面各个直播间的链接、标题、主播名字、热度等。
网页代码中这些的文字就是我需要的。
我们需要的内容都在这个li下面,右键它Copy→复制完整的XPath,得到/html/body/section/main/section[2]/div[2]/ul/li[1]
,接下来就要用到这个。这里去掉最后的[1]
得到的/html/body/section/main/section[2]/div[2]/ul/li
就是用来查找所有直播间信息框框的XPath
爬取直播间信息
怎么新建项目的就不提了,项目目录如图示:
setting.py
主要 的设置有下面几项:
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'INFO'
CONCURRENT_REQUESTS = 64
ITEM_PIPELINES = {
'douyu.pipelines.DouyuPipeline': 300,
}
斗鱼有反爬虫机制,所以设置不遵守robots.txt;设置log_level不显示DEBUG信息,不然待会运行起来一大堆DEBUG的log;同时处理的数量设置为64;然后开启pipelines.
items.py
import scrapy
class DouyuItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
url = scrapy.Field()
zone = scrapy.Field()
user = scrapy.Field()
hot = scrapy.Field()
我需要的数据是直播间标题、链接、分区、用户名、热度
pipelines.py
import csv
class DouyuPipeline:
def process_item(self, item, spider):
with open("doouyu.csv", "a", encoding="utf-8") as fp:
writer = csv.writer(fp)
writer.writerow((item['title'], item['url'], item['user'], item['zone'], item['hot']))
输出保存到csv文件
spiders/dy.py
import scrapy
from douyu.items import DouyuItem
class DySpider(scrapy.Spider):
name = 'dy'
allowed_domains = ['douyu.com']
start_urls = ['https://www.douyu.com/directory/all']
def parse(self, response):
li_list = response.xpath("/html/body/section/main/section[2]/div[2]/ul/li")
for li in li_list:
title = li.xpath("./div/a/div[2]/div[1]/h3/text()").extract_first()
url = li.xpath("./div/a/@href").extract_first()
zone = li.xpath("./div/a/div[2]/div[1]/span/text()").extract_first()
user = li.xpath("./div/a/div[2]/div[2]/h2/div/text()").extract_first()
hot