爬虫新人,学习中遇到的问题,请大佬指点

这个是例题的源码

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