这个是例题的源码
from lxml import *
from lxml import etree
import requests
import json
# 根据URL提取HTML代码,并返回这些代码,如果抓取失败,返回Nnoe
def getOnePage(url):
try:
res = requests.get(url)
if res.status_code == 200:
return res.text
return None
except Exception:
return None
# 分析HTML代码,这是一个产生器函数
def parseOnePage(html):
selector = etree.HTML(html)
# 选择<tr>节点
items = selector.xpath('//tr[@class="item"]')
# 在<tr>节点内部继续是哦那个XPath选择对应的节点
for item in items:
# 获取<p>节点中的文本,其中包含出版社,作者,出版日期等等信息
book_infos = item.xpath('td/p/text()')[0]
yield {
# 获取图书名称
'name': item.xpath('td/div/a/@title')[0],
# 获取图书主页链接
'url': item.xpath('td/div/a/@href')[0],
# 获取图书作者
'author': book_infos.split('/')[0],
# 获取图书出版社
'publisher': book_infos.split('/')[-3],
# 获取出版日期
'date': book_infos.split('/')[-2],
# 获取图书价格
'price': book_infos.split('/')[-1]
}
# 将抓取到的数据(json格式)保存到top250books.txt文件中
def save(content):
with open('top250books.txt', 'at', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '/n')
# 抓取url对应的页面,并将页面内容保存到top250books.txt文件中
def getTop250(url):
html = getOnePage(url)
for item in parseOnePage(html):
print(item)
save(item)
# 产生10个url,分别对应top250排行榜的10个页面的URL
urls = ['https://book.douban.com/top250?start={}'.format(str(i)) for i in range(0,250,25)]
#循环抓取top250排行版的10个页面的图书信息
for url in urls:
getTop250(url)
运行报错如下
Traceback (most recent call last):
line 39, in <module>getTop250(url)
line 33, in getTop250 for item in parseOnePage(html):
line 16, in parseOnePage selector = etree.HTML(html)
ValueError: can only parse strings
请大佬指点,哪里出了问题
requests.get要设置headers
def getOnePage(url):
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Content-Type': 'text/html; charset=utf-8',
}
try:
res = requests.get(url,headers=headers)
if res.status_code == 200:
return res.text
return None
except Exception:
return None
你这个爬虫得出的结果是none,需要添加请求头
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
}
res = requests.get(url,headers=header)
看看网站:https://blog.csdn.net/weixin_43507959/article/details/89891831
1.要添加请求头;
2.在# 获取图书出版社 'publisher': book_infos.split('/')[-3],代码这行添加判断,否则会出现超出索引错误,因为有的图书没标明出版社。
改后代码:
from lxml import *
from lxml import etree
import requests
import json
# 根据URL提取HTML代码,并返回这些代码,如果抓取失败,返回Nnoe
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"} #添加
def getOnePage(url):
try:
res = requests.get(url,headers=headers)
if res.status_code == 200:
return res.text
return None
except Exception:
return None
# 分析HTML代码,这是一个产生器函数
def parseOnePage(html):
selector = etree.HTML(html)
# 选择<tr>节点
items = selector.xpath('//tr[@class="item"]')
# 在<tr>节点内部继续是哦那个XPath选择对应的节点
for item in items:
# 获取<p>节点中的文本,其中包含出版社,作者,出版日期等等信息
book_infos = item.xpath('td/p/text()')[0]
yield {
# 获取图书名称
'name': item.xpath('td/div/a/@title')[0],
# 获取图书主页链接
'url': item.xpath('td/div/a/@href')[0],
# 获取图书作者
'author': book_infos.split('/')[0],
# 获取图书出版社
'publisher': book_infos.split('/')[-3] if len(book_infos.split('/'))>3 else '',#添加判断项,如无则显示空字符
# 获取出版日期
'date': book_infos.split('/')[-2],
# 获取图书价格
'price': book_infos.split('/')[-1]
}
# 将抓取到的数据(json格式)保存到top250books.txt文件中
def save(content):
with open('top250books.txt', 'at', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '/n')
# 抓取url对应的页面,并将页面内容保存到top250books.txt文件中
def getTop250(url):
html = getOnePage(url)
for item in parseOnePage(html):
print(item)
save(item)
# 产生10个url,分别对应top250排行榜的10个页面的URL
urls = [
'https://book.douban.com/top250?start={}'.format(str(i)) for i in range(0, 250, 25)]
#循环抓取top250排行版的10个页面的图书信息
for url in urls:
getTop250(url)
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632