Report

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

爬取豆瓣图书Top250实验报告

实验目的

通过实验熟悉爬虫的基本步骤:载入、解析、存储
学习运用 scrapy 框架
了解html、css、json基础知识

实验过程

1. 设计爬虫步骤
检查 豆瓣图书Top250 网页源代码,发现下一页链接结构如下

1 <span class="next">
2            <link rel="next" href="https://book.douban.com/top250?start=25"/>
3            <a href="https://book.douban.com/top250?start=25" >后页&gt;</a>
4 </span>

故可以利用 scrapy 文档给出的方法如下遍历所有页数

1 next_page = response.css('span.next a::attr(href)').get()


2        if next_page is not None:
3            yield response.follow(next_page, callback=self.parse)

检查每本书的网页结构,发现路径为 tr.item ,对应链接结构

1 <div class="pl2">
2              <a href="https://book.douban.com/subject/1007305/"
onclick=&#34;moreurl(this,{i:&#39;0&#39;})&#34; title="红楼梦">
3               红楼梦
4              </a>          
5            </div>

故可以如下进入每本书的链接

1 for book in response.css('tr.item'):


2            book_link = book.css('div.pl2 a::attr(href)').get()
3            yield scrapy.Request(url=book_link, callback=self.parse_book)

2. 提取书本信息
我们在Spider类下设计一个新方法 parse_book(self, response) 用于提取每本书的信息

检查发现每本书的信息(键值对)不尽相同,如《1984》中包含"译者","出品方"等键,但像《活着》中没
有。故如果采用提前设定好items.py中的键值对结构则需了解所有图书的键值对种类,不太方便。我采用
先将信息提取出来转换成字符串,然后再对该字符串操作转换成字典进行存储
首先书名和评分比较简单,检查源代码后发现可以通过 response.css('title::text').get() 和
response.css('strong::text').get() 得到

其余信息位于 <div id="info" class="">...<\div> 中,我们先设 response.css('div #info


::text') ,然后分奇偶将信息设置为键值对

1 for i in info:
2            j = i.get().strip().replace('\n','').replace(':','')
3            if j:
4                s = s + '"'+ j + '"'
5                if t % 2 == 0:
6                    s += ':'
7                else:
8                    s += ','
9                t += 1

其中 s 是储存信息的字符串, t 是计数器

3. 储存数据
利用 eval() 将字符串转换成字典,然后储存到JSON文件中

1 sample = eval(s)
2 file = open('result.json','a',encoding='utf8')
3 file.write(json.dumps(sample,ensure_ascii=False))
4 file.write('\n')
5 file.close

问题&解决

403 forbidden
response.status=403 ,爬虫被禁止访问

解决方案:在setting.py中修改user-agent

1 USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,


like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44"

上述USER_AGENT可在浏览器中"检查"-"网络"中找到。

另外可在setting.py中添加 LOG_LEVEL = "WARNING" ,使得在使用 scrapy shell 输出信息更简洁。

对于爬虫频繁导致IP请求异常的,可以通过设置代理或登录解决。

提取到的数据包含大量空格换行符
解决方案:使用 .strip() 、 .replace('\n','') 等方法

参考

1. Scrapy官方文档
2. 菜鸟教程: Scrapy 入门

You might also like