我不是第一个 发表于 2021-6-3 16:32:06

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

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

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()

wp231957 发表于 2021-6-4 05:59:16

这么几行代码,没必要封装成类吧
这样出错不方便调试的

我不是第一个 发表于 2021-6-4 08:51:49

wp231957 发表于 2021-6-4 05:59
这么几行代码,没必要封装成类吧
这样出错不方便调试的

新手 ,照葫芦画瓢。。{:5_109:}

wp231957 发表于 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/div/div/div/ul/li")
for x in range(len(data)):
   href=data.xpath(".//a/@href")
   print(href)

我不是第一个 发表于 2021-6-4 10:02:48

wp231957 发表于 2021-6-4 09:42
我给你写了一部分,其他的你自己研究研究
这是编辑推荐下面的部分href

谢谢大佬,我主要还是想要知道我错在哪里,想学通类和对象的用法。{:5_109:}   以后写项目可能会好点。{:5_95:}

wp231957 发表于 2021-6-4 10:04:04

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

xpath路径可能不正确

wp231957 发表于 2021-6-4 10:09:46

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

我的推荐是应该把所有需求都调通了,然后想类化在进行代码整理
你直接这样写,尤其是你可能对网络请求这块不是很熟,那么直接类化,导致你根本不知道是哪里发生了错误

我不是第一个 发表于 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()


我不是第一个 发表于 2021-6-4 11:06:07

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

每次带代码回答,都要审核,有点蛋痛。。{:5_109:}

wp231957 发表于 2021-6-4 11:08:31

我不是第一个 发表于 2021-6-4 11:06
每次带代码回答,都要审核,有点蛋痛。。

放在代码框里,会好一些

我不是第一个 发表于 2021-6-4 11:10:22

我不是第一个 发表于 2021-6-4 11:06
每次带代码回答,都要审核,有点蛋痛。。

基本找到问题了,我第二次请求的是列表,不是单个的链接。还要循环一次。。{:5_109:}
后面还有一个问题,提示我title是列表,看不懂。。明明已经 遍历了。贴不了代码

我不是第一个 发表于 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()


页: [1]
查看完整版本: 帮忙看下爬虫代码呀...大佬们