本帖最后由 空青 于 2019-8-8 11:30 编辑
这位童鞋,基础还是需要再打扎实点哈

我帮你看了下,查出问题所在了,以下是你贴出来的代码
- import requests
- from lxml import etree
- import urllib.request
- def getpage(pagenumber):
- baseurl = 'http://mzitu.92game.net/mm/index_2.html'
- selector=etree.HTML(requests.get(baseurl).content)
- urls = []
- for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
- urls.append(i)
- return urls
- #print(urls)
- def geturl(url):
- jpglist = []
- 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'}
- for each1 in url:
- urlhtml = 'http://mzitu.92game.net'+each1
- sel1 = etree.HTML(requests.get(urlhtml).content)
- jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
- jpglist.append(jpghtml)
- return jpglist
- def downpic(url1):
- for each in url1:
- filename = each.split('/')[-2]
- urllib.request.urlretrieve(each,filename)
- if __name__=='__main__':
- for eachs in getpage(pagenumber):
- print(geturl(eachs))
复制代码
我说下你代码的问题吧
1、有无效的参数
def getpage(pagenumber),这个pagenumber参数你实际上没有用到,在main函数主函数调用的时候你传入了一个pagenumber,但是这个pagenumber没有赋值。
我的建议:把这个无效的参数去掉,去掉后你的代码大致是以下这样
- def getpage():
- baseurl = 'http://mzitu.92game.net/mm/index_2.html'
- selector = etree.HTML(requests.get(baseurl).content)
- urls = []
- for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
- urls.append(i)
- return urls
- // 中间函数我略掉了
- if __name__ == '__main__':
- for eachs in getpage():
- print(geturl(eachs))
复制代码
2、有未使用的变量
def geturl(url)这个函数里面定义了一个headers头部信息,但是你在函数体里面没有使用,我估计是遗忘了。
我的建议:把这个headers加到requests请求参数里面去,避免被识别为爬虫被封禁。
def geturl(url)函数修改后为:
- def geturl(url):
- jpglist = []
- 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'}
- for each1 in url:
- urlhtml = 'http://mzitu.92game.net' + each1
- sel1 = etree.HTML(requests.get(urlhtml,headers=headers).content)
- jpghtml = sel1.xpath('//div[@class="main-image"]/p/a/img/@src')
- jpglist.append(jpghtml)
- 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、另外,
做网络请求时,最好做一个异常处理。因为你不知道会出什么问题。
最后贴个代码,你参考下。最后你保存图片的那个代码运行肯定也是有问题的,你自己可以再摸索摸索。
- import requests
- from lxml import etree
- import urllib.request
- 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'}
- def get_detail_url():
- '''
- 用于获取详情页的url列表
- :return: 详情页的url列表
- '''
- base_url = 'http://mzitu.92game.net/mm/index_2.html'
- selector = etree.HTML(requests.get(base_url,headers=headers).content)
- detail_urls = []
- for i in selector.xpath('//div[@class="postlist"]/ul/li/a/@href'):
- detail_urls.append(i)
- return detail_urls
- def get_image_urls(urls):
- '''
- 请求详情页url列表,解析出图片的url地址
- :param urls: 详情页url列表
- :return: 图片的url列表
- '''
- image_urls = []
- for detail_url in urls:
- tar_url = 'http://mzitu.92game.net' + detail_url
- content = etree.HTML(requests.get(tar_url, headers=headers).content)
- image_url = content.xpath('//div[@class="main-image"]/p/a/img/@src')
- image_urls.append(image_url)
- return image_urls
- def down_pic(image_urls):
- pass
- # for image_url in image_urls:
- # filename = image_url[0].split('/')[-2]
- # urllib.request.urlretrieve(image_url, filename)
- if __name__ == '__main__':
- detail_urls = get_detail_url()
- image_urls = get_image_urls(urls=detail_urls)
- print(image_urls)
复制代码