鱼C论坛

 找回密码
 立即注册
查看: 1641|回复: 15

[已解决]py

[复制链接]
发表于 2023-7-5 17:06:42 | 显示全部楼层 |阅读模式

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

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

x
大佬们,这个选择器显示有25个href,但爬取到26个,第26个是什么呀
  1. import requests
  2. import logging
  3. from urllib.parse import urljoin
  4. from pyquery import PyQuery as pq

  5. index_url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html'
  6. header = {
  7.    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
  8. }
  9. PAGE = 3
  10. logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')

  11. #发起请求
  12. def scrape_page(url):
  13.     logging.info('正在爬取:{}...'.format(url))
  14.     try:
  15.         response = requests.get(url=url,headers=header)
  16.         if response.status_code == 200:
  17.             return response.text
  18.         logging.error('出现错误,爬取代码:{}'.format(response.status_code))
  19.     except requests.RequestException:
  20.         logging.error('爬取{}出现错误'.format(url))

  21. #拼接url并发起请求
  22. def scrape_index(page):
  23.     url = index_url.format(page)
  24.     return scrape_page(url)


  25. #解析详情页url
  26. def detail_url(index_html):
  27.     details_url = []
  28.     doc = pq(index_html)
  29.     hrefs = doc('td a:nth-child(2)').items()
  30.     for href in hrefs:
  31.         urls = href.attr('href')
  32.         url = urljoin(index_url, urls)
  33.         details_url.append(url)

  34.     return details_url



  35. def main():
  36.     for page in range(1,2):
  37.         index_html = scrape_index(page)
  38.         href = detail_url(index_html)
  39.         print(len(href))
  40.         logging.info('detail_url:{}'.format(list(href)))


  41. if __name__ == '__main__':
  42.     main()
复制代码

这个是爬取到的url,
  1. 2023-07-05 17:01:34,079 - INFO: detail_url:['https://www.ygdy8.net/html/gndy/dyzz/20230630/63864.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230630/63863.html', 'https://www.ygdy8.net/html/gndy/jddy/20230629/63862.html', 'https://www.ygdy8.net/html/gndy/jddy/20230629/63861.html', 'https://www.ygdy8.net/html/gndy/jddy/20230629/63860.html', 'https://www.ygdy8.net/html/gndy/jddy/20230626/63851.html', 'https://www.ygdy8.net/html/gndy/jddy/20230626/63850.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230625/63845.html', 'https://www.ygdy8.net/html/gndy/jddy/20230624/63839.html', 'https://www.ygdy8.net/html/gndy/jddy/20230624/63838.html', 'https://www.ygdy8.net/html/gndy/jddy/20230624/63837.html', 'https://www.ygdy8.net/html/gndy/jddy/20230623/63835.html', 'https://www.ygdy8.net/html/gndy/jddy/20230623/63834.html', 'https://www.ygdy8.net/html/gndy/jddy/20230620/63827.html', 'https://www.ygdy8.net/html/gndy/jddy/20230618/63822.html', 'https://www.ygdy8.net/html/gndy/jddy/20230618/63821.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230618/63820.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230616/63815.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230615/63813.html', 'https://www.ygdy8.net/html/gndy/jddy/20230614/63812.html', 'https://www.ygdy8.net/html/gndy/jddy/20230614/63809.html', 'https://www.ygdy8.net/html/gndy/jddy/20230611/63801.html', 'https://www.ygdy8.net/html/gndy/jddy/20230611/63800.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230610/63799.html', 'https://www.ygdy8.net/html/gndy/dyzz/20230609/63797.html', 'https://www.ygdy8.netlist_4_3.html']
复制代码
最佳答案
2023-7-5 17:18:13
哈岁NB 发表于 2023-7-5 17:14
想请问一下,为什么源网页只有25个,他为什么爬到26个


我刚才已经解释过了,是因为你的选择器td a:nth-child(2)匹配了页面底部的一个分页链接,而不是电影详情链接。你可以看一下源网页的源代码,就会发现有一个这样的链接:

  1. <td align="right"><a href="list_4_3.html">下一页</a></td>
复制代码

这个链接的href属性是list_4_3.html,所以你的代码会把它拼接成’[删除中文url]https://www.ygdy8.netlist_4_3.html[/url]’,这就是你爬取到的第26个url。但这个url并不是你想要的电影详情url,所以你应该改用更精确的选择器,比如td.b a:nth-child(2)或者td.b a.ulink,来只匹配电影详情链接。这样就可以避免爬取到多余的url了。

屏幕截图(53).png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 17:06:57 | 显示全部楼层
本帖最后由 陶远航 于 2023-7-5 17:11 编辑

你的选择器显示有25个href,但爬取到26个,是因为你的代码中有一个错误。你应该使用link.attrib['href']或者pq(link).attr('href')来获取每个链接的href属性,而不是link.attr('href')。这样就可以避免出现AttributeError: ‘HtmlElement’ object has no attribute 'attr’的错误。

另外,你的代码中也有一个多余的url,就是最后一个’https://www.ygdy8.netlist_4_3.html’。这个url是因为你的选择器td a:nth-child(2)匹配了页面底部的一个分页链接,而不是电影详情链接。你可以改用更精确的选择器,比如td.b a:nth-child(2)或者td.b a.ulink,来只匹配电影详情链接。

希望这些信息对你有帮助。如果你还有其他问题,欢迎继续提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 17:09:56 | 显示全部楼层

根据你提供的输出信息,爬取到的第26个URL 是 https://www.ygdy8.netlist_4_3.html(无法打开的页面)。这个URL并不是一个有效的链接,它缺少了一部分内容。在代码中,拼接URL的逻辑是通过 `urljoin(index_url, urls)`来完成的。但是在这里,`index_url`变量并没有正确地传入到函数中,所以导致URL拼接出错。

要解决这个问题,你需要修改 `detail_url`函数中的 `urljoin(index_url, urls)`这一行代码。将其修改为 `urljoin(url, urls)`即可。这样做将会使用正确的`index_url`来完成URL的拼接。

修改后的代码如下:


  1. import requests
  2. import logging
  3. from urllib.parse import urljoin
  4. from pyquery import PyQuery as pq

  5. index_url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html'
  6. header = {
  7.    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
  8. }
  9. PAGE = 3
  10. logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')

  11. #发起请求
  12. def scrape_page(url):
  13.     logging.info('正在爬取:{}...'.format(url))
  14.     try:
  15.         response = requests.get(url=url,headers=header)
  16.         if response.status_code == 200:
  17.             return response.text
  18.         logging.error('出现错误,爬取代码:{}'.format(response.status_code))
  19.     except requests.RequestException:
  20.         logging.error('爬取{}出现错误'.format(url))

  21. #拼接url并发起请求
  22. def scrape_index(page):
  23.     url = index_url.format(page)
  24.     return scrape_page(url)


  25. #解析详情页url
  26. def detail_url(index_html):
  27.     details_url = []
  28.     doc = pq(index_html)
  29.     hrefs = doc('td a:nth-child(2)').items()
  30.     for href in hrefs:
  31.         urls = href.attr('href')
  32.         url = urljoin(url, urls)  # 修改这一行代码
  33.         details_url.append(url)

  34.     return details_url



  35. def main():
  36.     for page in range(1,2):
  37.         index_html = scrape_index(page)
  38.         href = detail_url(index_html)
  39.         print(len(href))
  40.         logging.info('detail_url:{}'.format(list(href)))


  41. if __name__ == '__main__':
  42.     main()
复制代码

希望这次能够解决你的问题。如果还有其他疑问,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:12:53 | 显示全部楼层
sfqxx 发表于 2023-7-5 17:09
根据你提供的输出信息,爬取到的第26个URL 是 https://www.ygdy8.netlist_4_3.html(无法打开的页面)。这 ...

这样它报错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:14:05 | 显示全部楼层
陶远航 发表于 2023-7-5 17:06
你的选择器显示有25个href,但爬取到26个,是因为你的代码中有一个错误。你应该使用link.attrib['href']或 ...

想请问一下,为什么源网页只有25个,他为什么爬到26个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 17:15:04 | 显示全部楼层

试试

  1. import requests
  2. import logging
  3. from urllib.parse import urljoin
  4. from pyquery import PyQuery as pq

  5. index_url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html'
  6. header = {
  7.    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
  8. }
  9. PAGE = 3
  10. logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')

  11. #发起请求
  12. def scrape_page(url):
  13.     logging.info('正在爬取:{}...'.format(url))
  14.     try:
  15.         response = requests.get(url=url,headers=header)
  16.         if response.status_code == 200:
  17.             return response.text
  18.         logging.error('出现错误,爬取代码:{}'.format(response.status_code))
  19.     except requests.RequestException:
  20.         logging.error('爬取{}出现错误'.format(url))

  21. #拼接url并发起请求
  22. def scrape_index(page):
  23.     url = index_url.format(page)
  24.     return scrape_page(url)


  25. #解析详情页url
  26. def detail_url(index_html):
  27.     details_url = []
  28.     doc = pq(index_html)
  29.     hrefs = doc('td a:nth-child(2)').items()
  30.     for href in hrefs:
  31.         urls = href.attr('href')
  32.         url = urljoin(url, urls)  # 修改这一行代码
  33.         details_url.append(url)

  34.     return details_url



  35. def main():
  36.     for page in range(1,2):
  37.         index_html = scrape_index(page)
  38.         href = detail_url(index_html)
  39.         print(len(href))
  40.         logging.info('detail_url:{}'.format(list(href)))


  41. if __name__ == '__main__':
  42.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 17:18:13 | 显示全部楼层    本楼为最佳答案   
哈岁NB 发表于 2023-7-5 17:14
想请问一下,为什么源网页只有25个,他为什么爬到26个


我刚才已经解释过了,是因为你的选择器td a:nth-child(2)匹配了页面底部的一个分页链接,而不是电影详情链接。你可以看一下源网页的源代码,就会发现有一个这样的链接:

  1. <td align="right"><a href="list_4_3.html">下一页</a></td>
复制代码

这个链接的href属性是list_4_3.html,所以你的代码会把它拼接成’[删除中文url]https://www.ygdy8.netlist_4_3.html[/url]’,这就是你爬取到的第26个url。但这个url并不是你想要的电影详情url,所以你应该改用更精确的选择器,比如td.b a:nth-child(2)或者td.b a.ulink,来只匹配电影详情链接。这样就可以避免爬取到多余的url了。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:18:33 | 显示全部楼层

还是报错,而且就算不拼接,爬到的也是26个
屏幕截图(54).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:19:15 | 显示全部楼层
陶远航 发表于 2023-7-5 17:18
我刚才已经解释过了,是因为你的选择器td a:nth-child(2)匹配了页面底部的一个分页链接,而不是电影详 ...

明白了明白了,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:19:42 | 显示全部楼层

解决了,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 17:20:43 | 显示全部楼层
哈岁NB 发表于 2023-7-5 17:19
解决了,感谢感谢

啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 17:22:16 | 显示全部楼层
你只爬25次不就行了????


  1. def main():
  2.     for page in range(1, 26):
  3.         index_html = scrape_index(page)
  4.         href = detail_url(index_html)
  5.         print(len(href))
  6.         logging.info('detail_url:{}'.format(list(href)))
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:23:03 | 显示全部楼层

那个css选择器多匹配了一个,改一下就好了,还是非常感谢您
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-5 17:24:01 | 显示全部楼层
哈岁NB 发表于 2023-7-5 17:23
那个css选择器多匹配了一个,改一下就好了,还是非常感谢您

给这个帖子评分呗

https://fishc.com.cn/thread-229812-1-1.html

求5鱼币5荣誉3贡献
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 17:26:05 | 显示全部楼层
sfqxx 发表于 2023-7-5 17:24
给这个帖子评分呗

https://fishc.com.cn/thread-229812-1-1.html

好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 17:27:32 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 14:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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