问题记录总结-豆瓣电影评分Top250名称爬取

碎碎念:
本文代码参考:Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
完整过程请参考上文,解释得非常清楚,感谢!
本文只在记录编写代码中遇到的问题以及知识点的学习(用啥学啥 (๑•̀ㅂ•́)و✧)
就 你有时候copy代码吧 也不一定能跑出来…
能跑出来吧 也不一定就完全弄懂了每一行代码…

文章目录

  • 学习:豆瓣电影Top250名称爬取
    • 完整代码
    • 知识点
        • requests库
        • BeautifulSoup库
        • 反爬虫技巧
        • 输出文档
  • 举一反三:豆瓣图书Top250名称爬取
    • 完整代码
    • 问题记录
        • 去除空格
        • 响应状态码: 418
  • 参考

学习:豆瓣电影Top250名称爬取

完整代码

先放上完整代码看看。

# 参考:https://blog.csdn.net/weixin_44547562/article/details/103533502
# 2019.12.16
# ASerendipity_
import time
import requests
from bs4 import BeautifulSoup


# 定义获取页面的函数
def get_page(url, params=None, headers=None):
    response = requests.get(url, headers=headers, params=params)
    page = BeautifulSoup(response.text, 'lxml')
    print(response.url)
    print("响应状态码:", response.status_code)

    return page


title_list = []  # 电影名列表
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Host': 'movie.douban.com'
}
for i in range(11):
    params = {"start": (i * 25)}
    page = get_page('https://movie.douban.com/top250', params=params, headers=headers)

    div_list = page.find_all('div', class_='hd')

    for div in div_list:
        title = div.a.span.text.strip()
        title_list.append(title)
    # 每次爬完后休眠1秒钟,防止爬取速度太快被封ip
    time.sleep(1)

# print(title_list)
doc = open('Top250Films.txt', 'w')
for i in range(len(title_list)):
    print(title_list[i],file=doc)
doc.close()

output:
问题记录总结-豆瓣电影评分Top250名称爬取_第1张图片
自动导出txt文档
问题记录总结-豆瓣电影评分Top250名称爬取_第2张图片

知识点

  • requests库

官方文档真是着实看不下去,找了一篇结构清晰一点的python3 requests详解,内容较完整,可参考。

import requests

def get_page(...)
	...
	response = requests.get(url, headers=headers, params=params)

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Host': 'movie.douban.com'
}
for i in range(11):
    params = {"start": (i * 25)}
    page = get_page('https://movie.douban.com/top250', params=params, headers=headers)
...

requests.get(url, *params, **kwargs)
-url: 需要爬取的网站地址。
-params: 即参数, url中的额外参数,字典或者字节流格式,可选。
-**kwargs : 12个控制访问的参数

拿本篇代码举例
第一页网址:https://movie.douban.com/top250
第二页网址:https://movie.douban.com/top250?start=25
第三页网址:https://movie.douban.com/top250?start=50
… …
最后面start开始的内容就是参数啦。

还加了一个header,主要目的是模拟浏览器来对url发起访问,防止网站的反爬。

  • BeautifulSoup库

官方解释:

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.

功能解释得很精辟了!也可以参考一下这篇python:BeautifulSoup 模块使用指南,从安装到功能介绍和使用,写得都很详细。
这里用到的就是提取网页里的信息。

from bs4 import BeautifulSoup
...
response = requests.get(url, headers=headers, params=params)
page = BeautifulSoup(response.text, 'lxml')
...

response.text ——解析文档
‘lxml’——一种支持的解析器
解析之后的内容就放进 page 里面啦,之后就可以用其查找/修改内容了。比如用page.find_all(…)搜索。

反爬虫技巧

这里除了之前提到过的header,还用到了一个访问页面时的时间间隔1秒,也可以用random设置随机间隔秒数。

这篇文章讲了几个点反爬虫机制和破解方法汇总,摘了一部分下来。

策略1:设置下载延迟,比如数字设置为5秒,越大越安全
策略2:禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识别爬虫轨迹
策略3:使用user agent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信息,防止暴露爬虫身份
策略4:使用IP池,这个需要大量的IP资源,可以通过抓取网上免费公开的IP建成自有的IP代理池。
策略5:分布式爬取,这个是针对大型爬虫系统的,实现一个分布式的爬虫,主要为以下几个步骤:
1、基本的http抓取工具,如scrapy;
2、避免重复抓取网页,如Bloom Filter;
3、维护一个所有集群机器能够有效分享的分布式队列;
4、将分布式队列和Scrapy的结合;
5、后续处理,网页析取(如python-goose),存储(如Mongodb)。
策略6:模拟登录—浏览器登录的爬取
设置一个cookie处理对象,它负责将cookie添加到http请求中,并能从http响应中得到cookie,向网站登录页面发送一个请求Request, 包括登录url,POST请求的数据,Http header利用urllib2.urlopen发送请求,接收WEB服务器的Response。
问题记录总结-豆瓣电影评分Top250名称爬取_第3张图片

输出文档

doc = open('Top250Films.txt', 'w')
for i in range(len(title_list)):
    print(title_list[i],file=doc)
doc.close()

打开文档-读/写文档-关闭文档

参看Python中的文件IO操作(读写文件、追加文件)
我之前用write好像遇到了什么问题…但是不太记得了…所以换成了print…

举一反三:豆瓣图书Top250名称爬取

完整代码

# 2019.12.17
# ASerendipity_

import time
import requests
from bs4 import BeautifulSoup


# 定义获取页面的函数
def get_page(url, params=None, headers=None):
    response = requests.get(url, headers=headers, params=params)
    page = BeautifulSoup(response.text, 'lxml')
    print(response.url)
    print("响应状态码:", response.status_code)
    return page


bookTitle_list = []  # 书本名列表
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Host': 'book.douban.com'
}
for i in range(11):
    params = {"start": (i * 25)}
    page  = get_page('https://book.douban.com/top250', params=params, headers=headers)
    # page = get_page('https://book.douban.com/top250?start=0')
    div_list = page.find_all('div', class_='pl2')

    for div in div_list:
        bookTitle = "".join(div.a.text.split())  
        bookTitle_list.append(bookTitle)
    # 每次爬完后休眠1秒钟,防止爬取速度太快被封ip
    time.sleep(1)

#print(bookTitle_list)


doc = open('Top250Books.txt', 'w', encoding="utf-8")
for i in range(len(bookTitle_list)):
    print(bookTitle_list[i], file=doc)
doc.close()

output:
问题记录总结-豆瓣电影评分Top250名称爬取_第4张图片
同样的导出文档问题记录总结-豆瓣电影评分Top250名称爬取_第5张图片
跟上面的代码真的就很相似了,就不赘述了,遇到几个问题,写一下吧。

问题记录

去除空格

前一个代码用的是strip()去字符串首尾的空格,这一次就出现了问题。有些书的名字显示的格式不一样,比如↓
问题记录总结-豆瓣电影评分Top250名称爬取_第6张图片
就换了一种提取方式
“”.join(a.split())
这样中间的空格也能去掉啦~

这篇Python中常见字符串去除空格的方法总结讲的几种方法,可参考。

响应状态码: 418

这个简直…无解…
我正常的去搜了一下 然后发现了…↓↓↓问题记录总结-豆瓣电影评分Top250名称爬取_第7张图片
我: ???
现在明白了…触发了反爬…刚又遇到了

参考

  1. Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
  2. 官方文档:Requests: 快速上手
  3. python3 requests详解
  4. Beautiful Soup 4.4.0 文档
  5. python:BeautifulSoup 模块使用指南
  6. 反爬虫机制和破解方法汇总
  7. Python中的文件IO操作(读写文件、追加文件)
  8. Python中常见字符串去除空格的方法总结

你可能感兴趣的:(python学习)