鱼C论坛

 找回密码
 立即注册
查看: 1481|回复: 19

[已解决]兴趣乃学习的动力,爬虫求请教。第一次个人爬虫,写的很难看,emm

[复制链接]
发表于 2019-1-20 07:20:00 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 Stubborn 于 2019-1-20 07:28 编辑

这样写,能不能爬取到图片,哪里错了,请指点,麻烦了~~您未获授权,无法查看此网页. 403   
  1. #_*_coding:utf-8
  2. import requests,bs4,os
  3. from fake_useragent import UserAgent
  4. ua = UserAgent()
  5. os.makedirs(r'G:\down',exist_ok='Ture')
  6. os.chdir(r'G:\down')

  7. def get_url(url):
  8.     "请求网页函数,模拟请求头"
  9.     headers ={
  10.         'User-Agent': ua.random
  11.         }
  12.     page_data = requests.get(url,headers=headers)
  13.     soup_data = bs4.BeautifulSoup(page_data.text,'html.parser')
  14.     img_link = soup_data.find_all("span")
  15.     return img_link

  16. def get_Atlas_dict(img_link):
  17.     "获取到页面的图集URL和图集介绍"
  18.     Atlas_dict = dict()
  19.     try:
  20.         for i in img_link:
  21.             if i.a == None:
  22.                 pass
  23.             else:
  24.                 #题取出图集的名字和url,因为第一页有总网址,这个得删下,技术不足
  25.                 if i.a.text == "妹子图":
  26.                     pass
  27.                 else:
  28.                     Atlas_dict[i.a["href"]]= i.a.text
  29.     except:
  30.         pass
  31.     return Atlas_dict

  32. def get_Atls_jpg(img_link):
  33.     "返回每个图片的url列表"
  34.     Number_of_pages = []
  35.     atls_jpg_uri = [] #存放每个图片的rul
  36.     for i in img_link:
  37.         #获取到图集张数
  38.         try:
  39.             ss = int(i.text)
  40.             Number_of_pages.append(ss)
  41.         except:
  42.             pass
  43.         #获取到图集张数,捕捉每个图片的url
  44.     for each in range(1,max(Number_of_pages)):
  45.             url = "https://www.mzitu.com/164996"+"/"+str(each)
  46.             page_data = requests.get(url)
  47.             soup_data = bs4.BeautifulSoup(page_data.text, 'html.parser')
  48.             img_link = soup_data.find_all("div",class_="main-image")
  49.             for i in img_link:
  50.                 #<a href="https://www.mzitu.com/164996/2"><img alt="可爱眼镜娘Miko酱酒店开房激情阵阵 姿势撩人让人想入非非" height="1050" src="https://i.meizitu.net/2018/12/28c01.jpg" width="700"/></a>
  51.                 atls_jpg_uri.append(i.p.a.img["src"])
  52.                
  53.     return atls_jpg_uri

  54. def get_downsload(list):
  55.         “下载函数”
  56.     for i in list:
  57.         cont = 1
  58.         response = requests.get(i)
  59.         img = response.content
  60.         with open( '%s.jpg'%(cont),'wb' ) as f:
  61.             f.write(img)
  62.             print("第%s张图片下载完成" % (cont))
  63.             cont += 1

  64. if __name__ == "__main__":
  65.     number = int(input("输入需要下载的页数:"))
  66.     for each in range(1,number+1):
  67.         url = "https://www.mzitu.com/page/"+str(each)+"/"
  68.         img_link = get_url(url)  #请求网页,抓取图集URL
  69.         Atlas_dict = get_Atlas_dict(img_link) #抓取出图集的URL与信息,介绍是键值,RUL是键
  70.         for img_url in Atlas_dict:
  71.             img_uri= get_url(img_url) #请求网页,抓取出图片的URL
  72.             atls_jpg_uri_list = get_Atls_jpg(img_uri) #抓取出所有的图片的URL返回一个列表
  73.             #设置下载目录进行下载
  74.             dirs = r'G:\down'
  75.             if not os.path.exists(Atlas_dict[img_url]): #介绍作为文件名
  76.                 os.makedirs(Atlas_dict[img_url])
  77.                 os.chdir(Atlas_dict[img_url])
  78.                 #开始下载啦
  79.                 print("正在下载图集:{}".format(Atlas_dict[img_url]))
  80.                 get_downsload(img_url)
复制代码
最佳答案
2019-1-20 07:20:01
  1. import requests
  2. from bs4 import BeautifulSoup as bs

  3. def get_response(url):
  4.     header = {
  5.         'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  6.         'accept-encoding': 'gzip, deflate, br',
  7.         'accept-language': 'zh-CN,zh;q=0.9',
  8.         'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
  9.     }
  10.     response = requests.get(url=url,headers=header)

  11.     return response

  12. def get_link(response):
  13.     soup = bs(response.text,'lxml')
  14.     links = soup.select('#pins li span a')
  15.     print(len(links))
  16.     for each in links:
  17.         get_gril_data(each['href'])

  18. def get_gril_data(url):
  19.     response = get_response(url)
  20.     soup = bs(response.text,'lxml')
  21.     title = soup.select_one('.main-title').text
  22.     category = soup.select_one('.main-meta span a').text
  23.     img_link = soup.select_one('.main-image p a img')['src']
  24.     max_page = int(soup.select('.pagenavi a span')[-2].text) + 1
  25.     download_img(img_link,url)
  26.     for each in range(2,max_page):
  27.         if each < 10:
  28.             img_url = f'{img_url[:-6]}0{each}'
  29.         else:
  30.             img_url = f'{img_url[:-6]}{each}'
  31.         refer_url = f'{url}/{each}'
  32.         download_img(img_url,refer_url)

  33. def download_img(img_url,refer_url):
  34.     header = {
  35.         'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  36.         'accept-encoding': 'gzip, deflate, br',
  37.         'accept-language': 'zh-CN,zh;q=0.9',
  38.         'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
  39.         'refer':refer_url
  40.     }
  41.     # 剩下的自己写吧,就是怎么保存的问题了
  42. def main():
  43.     base_url = 'https://www.mzitu.com/'
  44.     response = get_response(base_url)
  45.     soup = bs(response.text,'lxml')
  46.     max_num = int(soup.select('.nav-links a')[-2].text) + 1
  47.     get_link(response)

  48. if __name__ == '__main__':
  49.     main()
复制代码

剩下保存和翻页的问题了。
这个随意写的,不是很规范(因为我比较懒)

不习惯直接保存图片的写法,也就这样了

最佳答案

查看完整内容

剩下保存和翻页的问题了。 这个随意写的,不是很规范(因为我比较懒) 不习惯直接保存图片的写法,也就这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 07:20:01 | 显示全部楼层    本楼为最佳答案   
  1. import requests
  2. from bs4 import BeautifulSoup as bs

  3. def get_response(url):
  4.     header = {
  5.         'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  6.         'accept-encoding': 'gzip, deflate, br',
  7.         'accept-language': 'zh-CN,zh;q=0.9',
  8.         'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
  9.     }
  10.     response = requests.get(url=url,headers=header)

  11.     return response

  12. def get_link(response):
  13.     soup = bs(response.text,'lxml')
  14.     links = soup.select('#pins li span a')
  15.     print(len(links))
  16.     for each in links:
  17.         get_gril_data(each['href'])

  18. def get_gril_data(url):
  19.     response = get_response(url)
  20.     soup = bs(response.text,'lxml')
  21.     title = soup.select_one('.main-title').text
  22.     category = soup.select_one('.main-meta span a').text
  23.     img_link = soup.select_one('.main-image p a img')['src']
  24.     max_page = int(soup.select('.pagenavi a span')[-2].text) + 1
  25.     download_img(img_link,url)
  26.     for each in range(2,max_page):
  27.         if each < 10:
  28.             img_url = f'{img_url[:-6]}0{each}'
  29.         else:
  30.             img_url = f'{img_url[:-6]}{each}'
  31.         refer_url = f'{url}/{each}'
  32.         download_img(img_url,refer_url)

  33. def download_img(img_url,refer_url):
  34.     header = {
  35.         'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  36.         'accept-encoding': 'gzip, deflate, br',
  37.         'accept-language': 'zh-CN,zh;q=0.9',
  38.         'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
  39.         'refer':refer_url
  40.     }
  41.     # 剩下的自己写吧,就是怎么保存的问题了
  42. def main():
  43.     base_url = 'https://www.mzitu.com/'
  44.     response = get_response(base_url)
  45.     soup = bs(response.text,'lxml')
  46.     max_num = int(soup.select('.nav-links a')[-2].text) + 1
  47.     get_link(response)

  48. if __name__ == '__main__':
  49.     main()
复制代码

剩下保存和翻页的问题了。
这个随意写的,不是很规范(因为我比较懒)

不习惯直接保存图片的写法,也就这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-20 07:22:32 | 显示全部楼层
@heidern0612 大哥,@四点好 大神~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 08:52:24 | 显示全部楼层
本帖最后由 heidern0612 于 2019-1-20 08:54 编辑
Stubborn 发表于 2019-1-20 07:22
@heidern0612 大哥,@四点好 大神~




你学的太快了,我还不会爬网页,你问问塔利班大神吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-20 18:18:03 | 显示全部楼层
heidern0612 发表于 2019-1-20 08:52
你学的太快了,我还不会爬网页,你问问塔利班大神吧。

写的很难看,还爬不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:10:15 | 显示全部楼层
Stubborn 发表于 2019-1-20 07:22
@heidern0612 大哥,@四点好 大神~

我也是菜鸟,我现在看看,我用的BS4,都是对照书里面的 BS(XX,‘lxml’)的,你的是(xx,'html,parser'),我现在尝试着看一下代码运行,反正原理都差不多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-20 23:29:46 | 显示全部楼层
四点好 发表于 2019-1-20 23:10
我也是菜鸟,我现在看看,我用的BS4,都是对照书里面的 BS(XX,‘lxml’)的,你的是(xx,'html,parser') ...

3Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:40:06 | 显示全部楼层
你的浏览器头呢??
妹子图那个网站请求图片还需要refer参数。
没记错的话,这个网站2018年后的url地址是需要json配合的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-20 23:44:15 | 显示全部楼层
本帖最后由 Stubborn 于 2019-1-20 23:45 编辑
wongyusing 发表于 2019-1-20 23:40
你的浏览器头呢??
妹子图那个网站请求图片还需要refer参数。
没记错的话,这个网站2018年后的url地址是 ...

  1. def get_url(url):
  2.     "请求网页函数,模拟请求头"
  3.     headers ={
  4.         'User-Agent': ua.random
  5.         }
复制代码


headers 还要加什么参数吗?我记得你经常爬。肯定有建议
还有这里,每个图片的URL获取不到是什么原因?
图片的URL只能抓取到第一个,后面全部被拒绝403
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:46:38 | 显示全部楼层
我不懂html.parser的抓取数据原理,你有需要的话,我用BS4(XX,‘lxml’)给你改下?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:51:53 | 显示全部楼层
Stubborn 发表于 2019-1-20 23:44
headers 还要加什么参数吗?我记得你经常爬。肯定有建议
还有这里,每个图片的URL获取 ...

就图片本来页面的地址啊
假如说你在
  1. porksuimai.com
  2. # 上面有个图片
  3. # 而需要的图片链接是
  4. api.porksuimai.com/img/1.jpg
复制代码

refer 参数就是porksuimai.com
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:52:33 | 显示全部楼层
iwanna 发表于 2019-1-20 23:43
有地址吗,论坛里面这个网站的爬虫挺多,有些可能过时了.还都是回复可见的,懒得一个个回复

我的没过时,只是被人举报了。
理由,过于色情
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-20 23:53:09 | 显示全部楼层
四点好 发表于 2019-1-20 23:46
我不懂html.parser的抓取数据原理,你有需要的话,我用BS4(XX,‘lxml’)给你改下?

不用,兴趣,你不是已经有了吗,又不是稀罕那个图片,写代码,在于成功的一刻,我擦,终于扒下来了,这种感觉~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-20 23:59:26 | 显示全部楼层
iwanna 发表于 2019-1-20 23:54
有存着吗,发一下.或者你有github账号吗

刚换了电脑,在另一台电脑上才有。过完年才能发出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-21 00:01:06 | 显示全部楼层
wongyusing 发表于 2019-1-20 23:52
我的没过时,只是被人举报了。
理由,过于色情


帮我看看,图片的url只能抓到一个,后面全部被拒绝403是什么梗
图片的URL只能抓取到第一个,后面全部被拒绝403
https://fishc.com.cn/forum.php?m ... p;page=1#pid3731476
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-21 00:35:11 | 显示全部楼层
本帖最后由 Stubborn 于 2019-1-21 00:36 编辑
iwanna 发表于 2019-1-20 23:54
有存着吗,发一下.或者你有github账号吗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-25 10:51:13 | 显示全部楼层
很厉害,我到现在还没有一个完整的写爬虫的思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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