鱼C论坛

 找回密码
 立即注册
查看: 1271|回复: 7

[已解决]怎么请求失败啊 一直 拿出来可以正常请求

[复制链接]
发表于 2019-8-6 17:03:34 | 显示全部楼层 |阅读模式

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

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

x
代码  
  1. import requests
  2. from lxml import etree
  3. import urllib.request


  4. def getpage(pagenumber):
  5.         baseurl = 'http://mzitu.92game.net/mm/index_2.html'
  6.         selector=etree.HTML(requests.get(baseurl).content)
  7.         urls = []
  8.         for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  9.                 urls.append(i)
  10.         return urls
  11. #print(urls)
  12. def geturl(url):
  13.         jpglist = []
  14.         headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  15.         for each1 in url:
  16.                 urlhtml = 'http://mzitu.92game.net'+each1
  17.                 sel1 = etree.HTML(requests.get(urlhtml).content)
  18.                 jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
  19.                 jpglist.append(jpghtml)
  20.         return jpglist

  21. def downpic(url1):
  22.         for each in url1:
  23.                 filename = each.split('/')[-2]
  24.                 urllib.request.urlretrieve(each,filename)
  25. if __name__=='__main__':
  26.         for eachs in getpage(pagenumber):
  27.                 print(geturl(eachs))
复制代码

错误信息为:requests.exceptions.ConnectionError: HTTPConnectionPool(host='mzitu.92game.netm', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000000003AD4708>: Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。'))
[Finished in 22.0s with exit code 1]
这是什么情况   
最佳答案
2019-8-7 11:40:31
本帖最后由 空青 于 2019-8-8 11:30 编辑

这位童鞋,基础还是需要再打扎实点哈 我帮你看了下,查出问题所在了,以下是你贴出来的代码

  1. import requests
  2. from lxml import etree
  3. import urllib.request


  4. def getpage(pagenumber):
  5.         baseurl = 'http://mzitu.92game.net/mm/index_2.html'
  6.         selector=etree.HTML(requests.get(baseurl).content)
  7.         urls = []
  8.         for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  9.                 urls.append(i)
  10.         return urls
  11. #print(urls)
  12. def geturl(url):
  13.         jpglist = []
  14.         headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  15.         for each1 in url:
  16.                 urlhtml = 'http://mzitu.92game.net'+each1
  17.                 sel1 = etree.HTML(requests.get(urlhtml).content)
  18.                 jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
  19.                 jpglist.append(jpghtml)
  20.         return jpglist

  21. def downpic(url1):
  22.         for each in url1:
  23.                 filename = each.split('/')[-2]
  24.                 urllib.request.urlretrieve(each,filename)
  25. if __name__=='__main__':
  26.         for eachs in getpage(pagenumber):
  27.                 print(geturl(eachs))
复制代码



我说下你代码的问题吧
1、有无效的参数
def getpage(pagenumber),这个pagenumber参数你实际上没有用到,在main函数主函数调用的时候你传入了一个pagenumber,但是这个pagenumber没有赋值。
我的建议:把这个无效的参数去掉,去掉后你的代码大致是以下这样

  1. def getpage():
  2.     baseurl = 'http://mzitu.92game.net/mm/index_2.html'
  3.     selector = etree.HTML(requests.get(baseurl).content)
  4.     urls = []
  5.     for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  6.         urls.append(i)
  7.     return urls
  8.   // 中间函数我略掉了
  9. if __name__ == '__main__':
  10.     for eachs in getpage():
  11.         print(geturl(eachs))
复制代码


2、有未使用的变量
def geturl(url)这个函数里面定义了一个headers头部信息,但是你在函数体里面没有使用,我估计是遗忘了。
我的建议:把这个headers加到requests请求参数里面去,避免被识别为爬虫被封禁。

def geturl(url)函数修改后为:
  1. def geturl(url):
  2.     jpglist = []
  3.     headers = {
  4.         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  5.     for each1 in url:
  6.         urlhtml = 'http://mzitu.92game.net' + each1
  7.         sel1 = etree.HTML(requests.get(urlhtml,headers=headers).content)
  8.         jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
  9.         jpglist.append(jpghtml)
  10.     return jpglist
复制代码


3、请求了错误的url,这也是造成你那个错误的原因
分析如下:
a、主函数入口,getpage()函数返回的实际上是一个详情页面的url相对路径的列表,类似于['/mm/167.html', '/mm/171.html', '/mm/168.html'....]
b、for循环遍历之后实际上已经得到一个url相对路径的字符串了,只需要进行拼接就好。但是你在遍历的时候又调用了geturl(url)函数,这个函数再次遍历了一次,也就是每一个详情页的url字符串进行了遍历,最后得到的结果类似于'/','m','m','/','1','6','7',.....这样拼接后的url自然也是错误的。
我的建议:要么只在主函数中做循环遍历,获取到详情页的url列表后,直接用geturl(url)函数调用。要么只在geturl(url)函数中进行遍历。

4、第四点算是一个建议吧,变量与函数的命名还可以再规范点

5、另外,做网络请求时,最好做一个异常处理。因为你不知道会出什么问题。

最后贴个代码,你参考下。最后你保存图片的那个代码运行肯定也是有问题的,你自己可以再摸索摸索。

  1. import requests
  2. from lxml import etree
  3. import urllib.request

  4. headers = {
  5.     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}


  6. def get_detail_url():
  7.     '''
  8.     用于获取详情页的url列表
  9.     :return: 详情页的url列表
  10.     '''
  11.     base_url = 'http://mzitu.92game.net/mm/index_2.html'
  12.     selector = etree.HTML(requests.get(base_url,headers=headers).content)
  13.     detail_urls = []
  14.     for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  15.         detail_urls.append(i)
  16.     return detail_urls


  17. def get_image_urls(urls):
  18.     '''
  19.     请求详情页url列表,解析出图片的url地址
  20.     :param urls: 详情页url列表
  21.     :return: 图片的url列表
  22.     '''
  23.     image_urls = []

  24.     for detail_url in urls:
  25.         tar_url = 'http://mzitu.92game.net' + detail_url
  26.         content = etree.HTML(requests.get(tar_url, headers=headers).content)
  27.         image_url = content.xpath('//div[@class="main-image"]/p/a/img/@src')
  28.         image_urls.append(image_url)
  29.     return image_urls


  30. def down_pic(image_urls):
  31.     pass
  32.     # for image_url in image_urls:
  33.     #     filename = image_url[0].split('/')[-2]
  34.     #     urllib.request.urlretrieve(image_url, filename)


  35. if __name__ == '__main__':
  36.     detail_urls = get_detail_url()
  37.     image_urls = get_image_urls(urls=detail_urls)
  38.     print(image_urls)
复制代码

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

使用道具 举报

发表于 2019-8-6 19:05:29 | 显示全部楼层
代码不能上传?
你确定你能编译通过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-6 19:42:31 | 显示全部楼层
ba21 发表于 2019-8-6 19:05
代码不能上传?
你确定你能编译通过

大哥  什么意思 啊    能不能说清楚点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-6 22:08:31 | 显示全部楼层
caiheng2019 发表于 2019-8-6 19:42
大哥  什么意思 啊    能不能说清楚点

叫你把代码上全。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-7 11:05:43 | 显示全部楼层
对方网站把你的连接断开了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-7 11:40:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 空青 于 2019-8-8 11:30 编辑

这位童鞋,基础还是需要再打扎实点哈 我帮你看了下,查出问题所在了,以下是你贴出来的代码

  1. import requests
  2. from lxml import etree
  3. import urllib.request


  4. def getpage(pagenumber):
  5.         baseurl = 'http://mzitu.92game.net/mm/index_2.html'
  6.         selector=etree.HTML(requests.get(baseurl).content)
  7.         urls = []
  8.         for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  9.                 urls.append(i)
  10.         return urls
  11. #print(urls)
  12. def geturl(url):
  13.         jpglist = []
  14.         headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  15.         for each1 in url:
  16.                 urlhtml = 'http://mzitu.92game.net'+each1
  17.                 sel1 = etree.HTML(requests.get(urlhtml).content)
  18.                 jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
  19.                 jpglist.append(jpghtml)
  20.         return jpglist

  21. def downpic(url1):
  22.         for each in url1:
  23.                 filename = each.split('/')[-2]
  24.                 urllib.request.urlretrieve(each,filename)
  25. if __name__=='__main__':
  26.         for eachs in getpage(pagenumber):
  27.                 print(geturl(eachs))
复制代码



我说下你代码的问题吧
1、有无效的参数
def getpage(pagenumber),这个pagenumber参数你实际上没有用到,在main函数主函数调用的时候你传入了一个pagenumber,但是这个pagenumber没有赋值。
我的建议:把这个无效的参数去掉,去掉后你的代码大致是以下这样

  1. def getpage():
  2.     baseurl = 'http://mzitu.92game.net/mm/index_2.html'
  3.     selector = etree.HTML(requests.get(baseurl).content)
  4.     urls = []
  5.     for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  6.         urls.append(i)
  7.     return urls
  8.   // 中间函数我略掉了
  9. if __name__ == '__main__':
  10.     for eachs in getpage():
  11.         print(geturl(eachs))
复制代码


2、有未使用的变量
def geturl(url)这个函数里面定义了一个headers头部信息,但是你在函数体里面没有使用,我估计是遗忘了。
我的建议:把这个headers加到requests请求参数里面去,避免被识别为爬虫被封禁。

def geturl(url)函数修改后为:
  1. def geturl(url):
  2.     jpglist = []
  3.     headers = {
  4.         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  5.     for each1 in url:
  6.         urlhtml = 'http://mzitu.92game.net' + each1
  7.         sel1 = etree.HTML(requests.get(urlhtml,headers=headers).content)
  8.         jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
  9.         jpglist.append(jpghtml)
  10.     return jpglist
复制代码


3、请求了错误的url,这也是造成你那个错误的原因
分析如下:
a、主函数入口,getpage()函数返回的实际上是一个详情页面的url相对路径的列表,类似于['/mm/167.html', '/mm/171.html', '/mm/168.html'....]
b、for循环遍历之后实际上已经得到一个url相对路径的字符串了,只需要进行拼接就好。但是你在遍历的时候又调用了geturl(url)函数,这个函数再次遍历了一次,也就是每一个详情页的url字符串进行了遍历,最后得到的结果类似于'/','m','m','/','1','6','7',.....这样拼接后的url自然也是错误的。
我的建议:要么只在主函数中做循环遍历,获取到详情页的url列表后,直接用geturl(url)函数调用。要么只在geturl(url)函数中进行遍历。

4、第四点算是一个建议吧,变量与函数的命名还可以再规范点

5、另外,做网络请求时,最好做一个异常处理。因为你不知道会出什么问题。

最后贴个代码,你参考下。最后你保存图片的那个代码运行肯定也是有问题的,你自己可以再摸索摸索。

  1. import requests
  2. from lxml import etree
  3. import urllib.request

  4. headers = {
  5.     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}


  6. def get_detail_url():
  7.     '''
  8.     用于获取详情页的url列表
  9.     :return: 详情页的url列表
  10.     '''
  11.     base_url = 'http://mzitu.92game.net/mm/index_2.html'
  12.     selector = etree.HTML(requests.get(base_url,headers=headers).content)
  13.     detail_urls = []
  14.     for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
  15.         detail_urls.append(i)
  16.     return detail_urls


  17. def get_image_urls(urls):
  18.     '''
  19.     请求详情页url列表,解析出图片的url地址
  20.     :param urls: 详情页url列表
  21.     :return: 图片的url列表
  22.     '''
  23.     image_urls = []

  24.     for detail_url in urls:
  25.         tar_url = 'http://mzitu.92game.net' + detail_url
  26.         content = etree.HTML(requests.get(tar_url, headers=headers).content)
  27.         image_url = content.xpath('//div[@class="main-image"]/p/a/img/@src')
  28.         image_urls.append(image_url)
  29.     return image_urls


  30. def down_pic(image_urls):
  31.     pass
  32.     # for image_url in image_urls:
  33.     #     filename = image_url[0].split('/')[-2]
  34.     #     urllib.request.urlretrieve(image_url, filename)


  35. if __name__ == '__main__':
  36.     detail_urls = get_detail_url()
  37.     image_urls = get_image_urls(urls=detail_urls)
  38.     print(image_urls)
复制代码

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

使用道具 举报

发表于 2019-8-7 12:09:47 | 显示全部楼层
代码不完整
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-8 11:05:25 | 显示全部楼层
空青 发表于 2019-8-7 11:40
这位童鞋,基础还是需要再打扎实点哈 我帮你看了下,查出问题所在了,以下是你贴出来的代码

大哥  太感谢啦    你打了这么多  我的好好研究一下   这是我自学的    基础不扎实   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-4 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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