一、bs4的基础知识点
from bs4 import BeautifulSoup
import requests
res = requests.get(url).text
###标签的选择方法###
soup = BeutifulSoup(res,'lxml')
soup.p.attrs['name'] #可以获得皮标签的name属性的值
soup.div.p.string #div标签下p标签的字符串
soup.p.children #p标签下所有子节点,返回是一个迭代器
soup.p.descendants #p标签下所有子孙节点,比如p的子节点下还有子节点,这个方法可以把这些节点都选中
soup.p.parent #p标签的父节点。
soup.p.parents #p节点的祖先节点
soup.p.next_siblings #p标签的下面的兄弟节点
soup.p.previous_siblings #p标签上面的兄弟节点
a.get_text() #获取a标签里面的text文本
##带有属性的选择方法##
soup.find_all('p') #选择所有p标签
soup.find_all(attrs={'id':'xxx'}) #选择所有ID属性值XXX
soup.find_all('p',attrs={'id':'xxx'}) #选择p标签中id属性值为xxx的所有内容
#####css选择器
soup.select('.xxx') #class为xxx的所有内容
soup.select('div p') #div标签下的p标签
soup.select('#xxxx') #id为xxx的内容
soup.select('div,li') #选择div,li标签
二、过程中遇到的一些错误
2.1 遇到的错误一
f"Invalid leading whitespace, reserved character(s), or return"
requests.exceptions.InvalidHeader: Invalid leading whitespace, reserved character(s), or returncharacter(s) in header value: ' Mozilla/5.0 (Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
这个问题出现的原因是因为在复制粘贴的User-Agent里面存在空格,就会导致报这个错误,把空格删掉以后这个错误就能得到解决.
2.2 遇到的错误二
Traceback (most recent call last):
File "/Users/poru/PycharmProjects/spider/python_douban/sipder_douban250.py", line 28, in <module>
score = item.find('span', {'class': 'rating_num '}).get_text()
AttributeError: 'NoneType' object has no attribute 'get_text'
这个问题出现的原因是因为在复制粘贴的{‘class’: 'rating_num '里面存在空格,就会导致报这个错误,把空格删掉以后这个错误就能得到解决.
2.3 遇到的错误三
Traceback (most recent call last):
File "/Users/poru/PycharmProjects/spider/python_douban/sipder_douban250.py", line 39, in <module>
w.writerows(result)
TypeError: a bytes-like object is required, not 'str'
遇到这个问题的原因是在打开文件的mode里面用的是‘wb’格式,但是我的结果的str类型的,所以报错。
三、源代码
import requests
from bs4 import BeautifulSoup
import csv
result = []
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/104.0.0.0 Safari/537.36 '
}
for i in range(0, 10):
url = f'https://movie.douban.com/top250?start={i * 25}&filter='
resp = requests.get(url, headers=header)
# print(resp)
resp.encoding = "utf-8"
soup = BeautifulSoup(resp.text, 'html.parser')
for item in soup.find_all('div', 'info'):
title = item.div.a.span.string
# print(title)
year = item.find('div', 'bd').p.contents[2].string
# 去掉换行符和空格
# year = year.replace('\n','')
# year = year.replace(' ', '')
year = year.strip()
year = year[0:4]
score = item.find('span', {'class': 'rating_num'}).get_text()
ls = [title, year, score]
result.append(ls)
# print(result)
with open('douban.csv', mode='wb') as f:
w = csv.writer(f)
w.writerows(result)