|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
import urllib.request
from bs4 import BeautifulSoup
import re
def main():
url='https://movie.douban.com/top250?start=' #基础网址
data1=[] #输出的列表数据
#1获取网站信息
for i in range(10):
url=url+str(i*25) #获取实际使用的网址
html = get_html(url) #获得每一页的html
data=jx(html) #把每一页需要的目标信息截取出来放在data里
data1.append(data) #把每一页的目标信息组成的列表放入一个新的列表里
return data1
#3保存目标信息
def get_html(url):
headers={
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 83.0.4103.106Safari / 537.36'
}
req=urllib.request.Request(url,headers=headers)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
return html
def jx(html):
#使用BeautifulSoup解析html获得一个能直接使用正则表达式匹配的新文档
soup=BeautifulSoup(html, 'html.parser')
#创建获取目标信息的正则表达式规则
findTitle=re.compile(r'<span class="title">(.*?)</span>')
findBd=re.compile(r'<p class="">(.*?)</p>')
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
findRatingNumber=re.compile(r'<span>(.*?人评价)</span>')
findlinl=re.compile(r'<a href="(.*?)" class="">')
findimg=re.compile(r'<img width="100" alt="(?:.*?)" src="(.*?)" class="">')
data=[] #初始化一个存放目标信息的列表
# 因为每一页有25个电影,使用for循环获取每一个电影的目标信息
for i in range(25):
item=re.findall(findTitle,soup)
#问题:我看教程上面item[i]要先转换成字符串,不懂求解
data.append(str(item[i]))
item = re.findall(findBd, soup)
data.append(str(item[i]))
item = re.findall(findRating, soup)
data.append(str(item[i]))
item = re.findall(findRatingNumber, soup)
data.append(str(item[i]))
item = re.findall(findlinl, soup)
data.append(str(item[i]))
item = re.findall(findimg, soup)
data.append(str(item[i]))
return data
if __name__=='__main__':
main()
Traceback (most recent call last):
File "C:/Users/tiger/PycharmProjects/spider/test能否爬取.py", line 74, in <module>
main()
File "C:/Users/tiger/PycharmProjects/spider/test能否爬取.py", line 19, in main
data=jx(html) #把每一页需要的目标信息截取出来放在data里
File "C:/Users/tiger/PycharmProjects/spider/test能否爬取.py", line 49, in jx
item=re.findall(findTitle,soup)
File "C:\Users\tiger\Anaconda3\lib\re.py", line 223, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or bytes-like object
看完教程后自己试着写了下,大佬们:
1.这写的有什么问题
2.代码里有个提问麻烦解答下
soup=BeautifulSoup(html, 'html.parser')
这里用 decode 转成字符串就好了
import urllib.request
from bs4 import BeautifulSoup
import re
def get_html(url):
headers={
'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 83.0.4103.106Safari / 537.36'
}
req=urllib.request.Request(url,headers=headers)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
return html
def jx(html):
#使用BeautifulSoup解析html获得一个能直接使用正则表达式匹配的新文档
soup=BeautifulSoup(html, 'html.parser').decode()
#创建获取目标信息的正则表达式规则
findTitle=re.compile(r'<span class="title">(.*?)</span>')
findBd=re.compile(r'<p class="">(.*?)</p>')
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
findRatingNumber=re.compile(r'<span>(.*?人评价)</span>')
findlinl=re.compile(r'<a href="(.*?)" class="">')
findimg=re.compile(r'<img width="100" alt="(?:.*?)" src="(.*?)" class="">')
data=[] #初始化一个存放目标信息的列表
# 因为每一页有25个电影,使用for循环获取每一个电影的目标信息
for i in range(25):
item=re.findall(findTitle,soup)
#问题1:我看教程上面item要先转换成字符串,不懂求解
data.append(str(item))
item = re.findall(findBd, soup)
data.append(str(item))
item = re.findall(findRating, soup)
data.append(str(item))
item = re.findall(findRatingNumber, soup)
data.append(str(item))
item = re.findall(findlinl, soup)
data.append(str(item))
item = re.findall(findimg, soup)
data.append(str(item))
return data
def main():
url='https://movie.douban.com/top250?start=' #基础网址
data1=[] #输出的列表数据
#1获取网站信息
for i in range(10):
url=url+str(i*25) #获取实际使用的网址
html = get_html(url) #获得每一页的html
data=jx(html) #把每一页需要的目标信息截取出来放在data里
data1.append(data) #把每一页的目标信息组成的列表放入一个新的列表里
return data1
#3保存目标信息
if __name__=='__main__':
print(main())
|
|