鱼C论坛

 找回密码
 立即注册
查看: 1835|回复: 11

帮忙看下爬虫代码呀...大佬们

[复制链接]
发表于 2021-6-3 16:32:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大佬没,指教下。。哪里出错了,代码没有报错,但是采集的不是自己想要的内容。  真是一看就会,一写就废呀。。

import requests
import re
from lxml import etree


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"

    def list_href(self,response):
        list_str=response.xpath("//div[@class='taglist']/ul/li")
        for li in list_str:
            list_url=li.xpath("./a[@target='_blank']/@href")[0]
            return list_url

    def arc_next(self,list_url):
        arc_str=requests.get(list_url)
        arc_str1 = etree.HTML(arc_str.text)
        list_str=arc_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
        for arc in list_str:
            arc_href=arc.xpath("./div[@class='artbox_l']/div[@class='artbox_l_t']/a/@href")[0]
            return arc_href

    def arc_body(self,arc_href):
        html=requests.get(arc_href)
        html1 = etree.HTML(html.text)
        title=html1.xpath("//h1[@class='h_title']/text()")
        #data=re.findall("<p style=\"text-align:center;padding:10px\">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
        body=html1.xpath("//div[@class='con_content']/text()")
        return title,body
    def run(self):
        #1 获取封面网址
        index_str=requests.get(self.index_url)
        response=etree.HTML(index_str.text)
        #2 获取列表网址
        list_url=self.list_href(response)
        #3获取文章网址
        arc_href=self.arc_next(list_url)
        #4 获取数据
        title,body=self.arc_body(arc_href)
        #5 保存数据

        print(title,body)

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-4 05:59:16 From FishC Mobile | 显示全部楼层
这么几行代码,没必要封装成类吧
这样出错不方便调试的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-4 08:51:49 | 显示全部楼层
wp231957 发表于 2021-6-4 05:59
这么几行代码,没必要封装成类吧
这样出错不方便调试的

新手 ,照葫芦画瓢。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-4 09:42:02 | 显示全部楼层
我不是第一个 发表于 2021-6-4 08:51
新手 ,照葫芦画瓢。。


我给你写了一部分,其他的你自己研究研究
这是编辑推荐下面的部分href
import requests
from lxml import etree
url="http://www.zuowen.com/gaozhong/"
headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
res=requests.get(url,headers=headers)
res.encoding="gb2312"
tree = etree.HTML(res.text)
data = tree.xpath("//div[5]/div[2]/div/div[2]/ul/li")
for x in range(len(data)):
     href=data[x].xpath(".//a/@href")
     print(href)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-4 10:02:48 | 显示全部楼层
wp231957 发表于 2021-6-4 09:42
我给你写了一部分,其他的你自己研究研究
这是编辑推荐下面的部分href

谢谢大佬,  我主要还是想要知道我错在哪里,想学通类和对象的用法。   以后写项目可能会好点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-4 10:04:04 From FishC Mobile | 显示全部楼层
我不是第一个 发表于 2021-6-4 10:02
谢谢大佬,  我主要还是想要知道我错在哪里,想学通类和对象的用法。   以后写项目可能会好点。 ...

xpath路径可能不正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-4 10:09:46 From FishC Mobile | 显示全部楼层
我不是第一个 发表于 2021-6-4 10:02
谢谢大佬,  我主要还是想要知道我错在哪里,想学通类和对象的用法。   以后写项目可能会好点。 ...

我的推荐是应该把所有需求都调通了,然后想类化在进行代码整理
你直接这样写,尤其是你可能对网络请求这块不是很熟,那么直接类化,导致你根本不知道是哪里发生了错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-4 11:04:02 | 显示全部楼层
wp231957 发表于 2021-6-4 10:09
我的推荐是应该把所有需求都调通了,然后想类化在进行代码整理
你直接这样写,尤其是你可能对网络请求这 ...

我刚才一个方法一个方法的请求,找到问题了。。哈哈。。
我请求的是列表,不是单个的链接。所以报错了。。还要循环一次。。  不过在最后一步还是有问题。 提示。title 是列表。  我没看明白。。



import requests
import re
from lxml import etree


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"
        self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.71 Safari/537.36"}
    def list_href(self,response):
        index_str=response.xpath("//div[@class='taglist']/ul/li")
        for li in index_str:
            list_url=li.xpath("./a[@target='_blank']/@href")
            return list_url

    def arc_next(self,list_url):
        for i in list_url:
            list_str=requests.get(i,headers=self.headers)
            list_str1 = etree.HTML(list_str.text)
            list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
            for arc in list_str2:
                arc_href=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
                return arc_href

    def arc_body(self,arc_href):
        for k in arc_href:
            html1=requests.get(k,headers=self.headers)
            html = etree.HTML(html1.text)
            title=html.xpath("//h1[@class='h_title']/text()")

            #data=re.findall("<p style=\"text-align:center;padding:10px\">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
            body=html.xpath("//div[@class='con_content']/text()")

            return title,body


    def run(self):
        #1 获取封面网址
        index_str=requests.get(self.index_url,headers=self.headers)
        response=etree.HTML(index_str.text)
        #2 获取列表网址
        list_url=self.list_href(response)

        #3获取文章网址
        arc_href=self.arc_next(list_url)
        print(arc_href)
        #4 获取数据
        title,body=self.arc_body(arc_href)
        #5 保存数据

        print(title,body)

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-4 11:06:07 | 显示全部楼层
wp231957 发表于 2021-6-4 10:09
我的推荐是应该把所有需求都调通了,然后想类化在进行代码整理
你直接这样写,尤其是你可能对网络请求这 ...

每次带代码回答,都要审核,有点蛋痛。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-4 11:08:31 From FishC Mobile | 显示全部楼层
我不是第一个 发表于 2021-6-4 11:06
每次带代码回答,都要审核,有点蛋痛。。

放在代码框里,会好一些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-4 11:10:22 | 显示全部楼层
我不是第一个 发表于 2021-6-4 11:06
每次带代码回答,都要审核,有点蛋痛。。

基本找到问题了,我第二次请求的是列表,不是单个的链接。还要循环一次。。
后面还有一个问题,提示我title是列表,看不懂。。明明已经 遍历了。贴不了代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-4 11:13:17 | 显示全部楼层
我不是第一个 发表于 2021-6-4 11:10
基本找到问题了,我第二次请求的是列表,不是单个的链接。还要循环一次。。
后面还有一个问题 ...
import requests
import re
from lxml import etree


class Zw:
    def __init__(self):
        self.index_url="http://www.zuowen.com/gaozhong/"
        self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.71 Safari/537.36"}
    def list_href(self,response):
        index_str=response.xpath("//div[@class='taglist']/ul/li")
        for li in index_str:
            list_url=li.xpath("./a[@target='_blank']/@href")
            return list_url

    def arc_next(self,list_url):
        for i in list_url:
            list_str=requests.get(i,headers=self.headers)
            list_str1 = etree.HTML(list_str.text)
            list_str2=list_str1.xpath("//div[@class='artlist']/div[@class='artlist_l']")
            for arc in list_str2:
                arc_href=arc.xpath("./div/div[@class='artbox_l_t']/a/@href")
                return arc_href

    def arc_body(self,arc_href):
        for k in arc_href:
            html1=requests.get(k,headers=self.headers)
            html = etree.HTML(html1.text)
            title=html.xpath("//h1[@class='h_title']/text()")

            #data=re.findall("<p style="text-align:center;padding:10px">20\d{2}-\d{2}-\d{2}.*?</p>",html1)
            body=html.xpath("//div[@class='con_content']/text()")

            return title,body


    def run(self):
        #1 获取封面网址
        index_str=requests.get(self.index_url,headers=self.headers)
        response=etree.HTML(index_str.text)
        #2 获取列表网址
        list_url=self.list_href(response)

        #3获取文章网址
        arc_href=self.arc_next(list_url)
        print(arc_href)
        #4 获取数据
        title,body=self.arc_body(arc_href)
        #5 保存数据

        print(title,body)

if __name__ == "__main__":
    zuowen=Zw()
    zuowen.run()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表