15972156903 发表于 2020-12-17 04:33:15

想通过xpath来爬取一系列的url,不知道哪里出错来,请指教!

import requests
from lxml import etree

if __name__=="__main__":
    #Ua伪装
    headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
      }
    #获取页面地址
    list_url = []
    url_1 = "https://sc.chinaz.com/jianli/free.html"
    list_url.append(url_1)
    # for i in range(2,4):
    #   url_n = "https://sc.chinaz.com/jianli/free_{}.html".format(i)
    #   list_url.append(url_n)

    page_text = requests.get(url=url_1,headers=headers).text
    tree = etree.HTML(page_text)%
    jianli_list = []
    jianli_div = tree.xpath("//div[@id='main']/div/a")
    for a in jianli_div:
      jianli_web = a.xpath("./@href/text()")
      print(jianli_web)





最后返回的结果是Process finished with exit code 0,我的目的就是想把网页里的url给添加到一个列表里去,怎么也成功不了,愁到凌晨4点了,跪请老鸟教育。。不知道是不是xpath写错了 还是什么情况

suchocolate 发表于 2020-12-17 09:02:34

页面里所有用到的url过滤src和href即可,有的数据如果不想用,你可以遍历整个列进行剔除。

import requests
import re


def main():
    url = 'https://sc.chinaz.com/jianli/free.html'
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    result = re.findall(r'(?:href|src)="(.*?)"', r.text)
    print(result)


if __name__ == '__main__':
    main()

YunGuo 发表于 2020-12-17 15:45:27

xpath语法错误,多学学基础。
这一段修改一下
page_text = requests.get(url=url, headers=header).text
tree = etree.HTML(page_text)
jianli_list = []
jianli_div = tree.xpath("//div[@id='main']/div/div")
for a in jianli_div:
    jianli_web = 'https:' + a.xpath("a/@href")
    print(jianli_web)

15972156903 发表于 2020-12-18 02:45:06

suchocolate 发表于 2020-12-17 09:02
页面里所有用到的url过滤src和href即可,有的数据如果不想用,你可以遍历整个列进行剔除。

好像您的方式是用正则,我在学习xpath,因为好像其他编程也可以用xpath。非常感谢您的指点。

15972156903 发表于 2020-12-18 02:46:45

YunGuo 发表于 2020-12-17 15:45
xpath语法错误,多学学基础。
这一段修改一下

非常感谢您的指点,上个帖子也是您帮忙指点的。因为工作原因和家庭原因,每天只有这个点能有时间学习python,感谢互联网,也感谢有您这样不吝赐教的前辈!!!

15972156903 发表于 2020-12-18 03:28:04

YunGuo 发表于 2020-12-17 15:45
xpath语法错误,多学学基础。
这一段修改一下

那最后再麻烦您一下,我之前不是想创建一个空的list_url,用来添加首页url_1和后续页url_n,做成一个分页爬取的列表集合,但是发起get请求时,url=list_url,运行后就会报错,但是换成url_1或者url_n就不会报错。请问这个地方该怎么操作呢?不知道我说清楚了没。。{:5_111:}

suchocolate 发表于 2020-12-18 10:55:23

15972156903 发表于 2020-12-18 03:28
那最后再麻烦您一下,我之前不是想创建一个空的list_url,用来添加首页url_1和后续页url_n,做成一个分页 ...


import requests
from lxml import etree


def main():
    headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
    result = []
    url = "https://sc.chinaz.com/jianli/free.html"
    num = int(input('请输入查询的页数:'))
    for i in range(num):
      r = requests.get(url, headers=headers)
      html = etree.HTML(r.text)
      temp = html.xpath('//div[@id="main"]/div/div/a/@href')
      result.extend(temp)
      nx_url = html.xpath('//a[@class="nextpage"]/@href')
      url = 'https://sc.chinaz.com/jianli/' + nx_url
    print(result)


if __name__ == "__main__":
    main()

YunGuo 发表于 2020-12-18 16:11:01

15972156903 发表于 2020-12-18 03:28
那最后再麻烦您一下,我之前不是想创建一个空的list_url,用来添加首页url_1和后续页url_n,做成一个分页 ...

程序前面执行了将url添加到列表,你的list_url是一个包含所有url的列表,需要先利用for循环取出,再去请求,不能直接get列表。
#获取页面地址
list_url = []
url_1 = "https://sc.chinaz.com/jianli/free.html"
list_url.append(url_1)
for i in range(2,4):
   url_n = "https://sc.chinaz.com/jianli/free_{}.html".format(i)
   list_url.append(url_n)
# 循环取出url请求
for url in list_url:
    page_text = requests.get(url, headers=headers).text
    tree = etree.HTML(page_text)
    jianli_list = []
    jianli_div = tree.xpath("//div[@id='main']/div/div")
    for a in jianli_div:
      jianli_web = 'https:' + a.xpath("a/@href")
      print(jianli_web)

15972156903 发表于 2020-12-19 03:07:06

YunGuo 发表于 2020-12-18 16:11
程序前面执行了将url添加到列表,你的list_url是一个包含所有url的列表,需要先利用for循环取出,再去 ...

非常感谢,就是差那临门一脚,原来如此。。哈哈。憋了我几天了。。

15972156903 发表于 2020-12-19 03:10:25

suchocolate 发表于 2020-12-18 10:55


您的代码我跑了一下,好像是可以指定页的爬取。收藏了,多看看前辈代码学习经验{:5_101:}

15972156903 发表于 2020-12-19 03:27:55

suchocolate 发表于 2020-12-18 10:55


请问下前辈,为什么在for循环里 假如爬取的是第二页或后面页,可以执行最后用前缀加nx_url拼好的url来发起get请求呢?而不是用最上面resulr下一行定义好的url呢?

YunGuo 发表于 2020-12-19 13:11:49

15972156903 发表于 2020-12-19 03:27
请问下前辈,为什么在for循环里 假如爬取的是第二页或后面页,可以执行最后用前缀加nx_url拼好的url来发 ...

他那个代码读出来很简单啊,兄弟,python基础建议多学习。python程序是从上往下执行:

result下面那个url是第一页,for循环内那个拼接的url相当于重新赋值了result下面那个url,所以当再次循环的时候url已经不一样了,这样说能明白?

15972156903 发表于 2020-12-21 03:41:05

YunGuo 发表于 2020-12-19 13:11
他那个代码读出来很简单啊,兄弟,python基础建议多学习。python程序是从上往下执行:

result下面那个 ...

感觉有点是懂非懂。。可能是我代码写少了。。。{:5_100:} 最近多看看大佬的代码。。自己去摸索哈。。感谢。
页: [1]
查看完整版本: 想通过xpath来爬取一系列的url,不知道哪里出错来,请指教!