python3+Scrapy爬虫入门

Love The Way You Lie 2023-02-19 05:24 178阅读 0赞

创建项目

scrapy startproject douban

在这里插入图片描述
红框中是指出创建一个新爬虫。

创建爬虫

cd douban
scrapy genspider girls https://www.douban.com/group/641424/

在这里插入图片描述
自此,我们的项目算是基本创建好了,其中“girls”是指爬虫的名称,“https://www.douban.com/group/641424/”爬虫的域名。不过为了方便我们项目启动,可以在项目中新建一个entrypoint.py文件,文件内容如下:

  1. from scrapy.cmdline import execute
  2. execute(['scrapy', 'crawl', 'girls'])

项目架构图
在这里插入图片描述

创建Item

创建一个新的Item方便我们保存所爬取的数据。
下面我们就来创建保存数据Item:

  1. # -*- coding: utf-8 -*-
  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # https://doc.scrapy.org/en/latest/topics/items.html
  6. import scrapy
  7. class DoubanItem(scrapy.Item):
  8. # define the fields for your item here like:
  9. # name = scrapy.Field()
  10. pass
  11. class GirlItem(scrapy.Item):
  12. title = scrapy.Field() # 标题
  13. author = scrapy.Field() # 作者
  14. url = scrapy.Field() # url
  15. lastTime = scrapy.Field() # 最近回应时间
  16. detail_time = scrapy.Field() # 发帖时间
  17. detail_report = scrapy.Field() # 发帖内容
  18. def __str__(self):
  19. return '{"title": "%s", "author": "%s", "url": "%s", "lastTime": "%s", "detail_time": "%s", "detail_report": "%s"}\n' %(self['title'], self['author'], self['url'], self['lastTime'], self['detail_time'], self['detail_report'])

之所以要从写__str__方法,是因为要将它展示成我们想展示的样子。

上面DoubanItem是由scrapy自动生成出来的,我们暂时先不管它,如果你想直接用系统创建的那个Item也是可以的。我这里是自己新创建一个,看起来比较好管理。

爬取网页

首先修改setting.py,添加USER_AGENT以及修改ROBOTSTXT_OBEY

  1. USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
  2. ROBOTSTXT_OBEY = False

字段title author url lastTime在第一层URL中可以爬取到,而detail_time detail_report则是要根据url继续下钻爬取。所以在parse方法中继续下钻调用detail_parse方法,在detail_parse方法中将item保存至文件中。

完整代码:

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from bs4 import BeautifulSoup
  4. from items import GirlItem
  5. class GirlsSpider(scrapy.Spider):
  6. name = 'girls'
  7. allowed_domains = ['www.douban.com']
  8. start_urls = ['https://www.douban.com/group/641424/discussion?start=25']
  9. # 重写start_requests方法
  10. # def start_requests(self):
  11. # # 浏览器用户代理
  12. # headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
  13. # return [scrapy.Request(url=self.start_urls[0], callback=self.parse, headers=headers)]
  14. def parse(self, response):
  15. html = response.text
  16. soup = BeautifulSoup(html, "lxml")
  17. # print("开始打印soup")
  18. # print(soup)
  19. table = soup.table
  20. tr_arr = table.find_all("tr")
  21. for tr in tr_arr:
  22. item = GirlItem()
  23. tds = tr.find_all('td')
  24. item['title'] = tds[0].get_text().replace('\n','').replace(' ', '')
  25. item['author'] = tds[1].get_text().replace('\n','').replace(' ', '')
  26. item['lastTime'] = tds[3].get_text().replace('\n','')
  27. try:
  28. item['url'] = tds[0].find('a',href=True)['href']
  29. # 根据内页地址爬取
  30. yield scrapy.Request(item['url'], meta={ 'item': item}, callback=self.detail_parse)
  31. except:
  32. item['url'] = ""
  33. #找到下一个链接,也就是翻页
  34. next_url = soup.find(name='div', attrs={ "class":"paginator"}).find(name='span', attrs={ "class":"next"}).find(name='link')['href']
  35. if next_url:
  36. print("开始下一页")
  37. yield scrapy.Request(next_url, callback=self.parse)
  38. def detail_parse(self, response):
  39. # 接收上级已爬取的数据
  40. item = response.meta['item']
  41. try:
  42. item['detail_time'] = response.xpath('//*[@id="topic-content"]/div[2]/h3/span[2]/text()').extract()[0]
  43. except BaseException as e:
  44. print(e)
  45. item['detail_time'] = ""
  46. try:
  47. item['detail_report'] = response.xpath('//*[@id="link-report"]').extract()[0].replace('\n','')
  48. except BaseException as e:
  49. print(e)
  50. item['detail_report'] = ""
  51. write_to_file('E:/douban-detail.txt', item)
  52. # return item
  53. def write_to_file (file_name, txt):
  54. # print("正在存储文件" + str(file_name))
  55. # w 如果没有这个文件将创建这个文件
  56. ''' 'r':读 'w':写 'a':追加 'r+' == r+w(可读可写,文件若不存在就报错(IOError)) 'w+' == w+r(可读可写,文件若不存在就创建) 'a+' ==a+r(可追加可写,文件若不存在就创建) '''
  57. f = open(file_name, 'a', encoding='utf-8')
  58. f.write(str(txt))
  59. f.close()

运行项目

python entrypoint.py

发表评论

表情:
评论列表 (有 0 条评论,178人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python scrapy 爬虫

    码运行来了python scrapy框架,搭建一个完整爬虫工程架构,不只是一个py文件。 建议在linux运行 参考: [https://www.jianshu.co...

    相关 Python爬虫Scrapy入门

    Scrapy组成 Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。 ![在这里插入图片描述]

    相关 python3 爬虫入门

    这里爬取猫眼电影 TOP100 榜的信息,作为学习的第一个Demo。 今天开始接触的python,从爬虫开始。 语言相对来说比较简单,环境配置到是花了不少时间。 作为

    相关 爬虫(七)scrapy入门

    Scrapy爬虫框架入门 Scrapy概述 Scrapy是Python开发的一个非常流行的网络爬虫框架,可以用来抓取Web站点并从页面中提取结构化的数据,被广泛的用