python爬虫第一弹之图片- BeautifulSoup与requests的完美结合(用requests和BeautifulSoup进行爬虫)

爬虫在我看来就是从一个接口找到下一个接口,不断的找到接口最终找到自己想要的

博主自小喜欢看漫画,这个图片爬虫自然要拿漫画来开刀。

首先,自然是导入各种各样的库

包含requests、BeautifulSoup、os

import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#读写头,拟人化,越完善越好
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
print(Soup)

运行成功


瞅准编辑推荐

打开浏览器看看他们都放在哪


可以发现漫画们都在<div>里的class="ulbox rhotbody"下的<a>中

获取所有在此栏目下的网址以及作品名

import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头,拟人化,越完善越好
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    title=a.get_text()
    href=a['href']
    print(href,title)
    

使用老套路

运行一下结果怎么好像有点不对。。。。

经过重重努力,最终放弃作品名保留网址就够,反正拼音也够用

import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    print(href)

但是这些网址还不完整,把他拼全,然后在解析获取一波

import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    #print(href)
    lage_url=all_url+href[1:]
    #print(lage_url)
    lage_url_get=requests.get(lage_url,headers=headers)
    lage_url_soup=BeautifulSoup(lage_url_get.text,'lxml')
    print(lage_url_soup)

这样就可以接着进行下去了

点第一个漫画进去自己想要的所有章节的网址

从表面上来看,这次有规律多了

好家伙这次总能让我抓标题了

这次很开心的瞬间码上,发现又出错了。。。。

 import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    #print(href)
    lage_url=str(all_url)+href[1:] #没有str  TypeError: can only concatenate list (not "str") to list
    #print(lage_url)
    lage_url_get=requests.get(lage_url,headers=headers)
    lage_url_soup=BeautifulSoup(lage_url_get.text,'lxml')
    #print(lage_url_soup)
    all_url=lage_url_soup.find('div',class_='mhlistbody').find_all('a')
    for a_a in all_url:
        title=a_a.get_text()
        href_s=a_a.get('href')
        print(title,href_s)

经过各方打探,知道了是切片出现了问题(split函数)但是无法修改呀,所以我选择强行把切片的步骤删了,直接将一级网址拼接。于是就解决了。

import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    #print(href)
    lage_url='http://www.manhuatai.com'+href#href直接就是str
    #print(lage_url)
    lage_url_get=requests.get(lage_url,headers=headers)
    lage_url_soup=BeautifulSoup(lage_url_get.text,'lxml')
    #print(lage_url_soup)
    all_url=lage_url_soup.find('div',class_='mhlistbody').find_all('a')
    for a_a in all_url:
        title=a_a.get_text()
        href_s=a_a.get('href')
        print(title,href_s) 

好了,终于又可以继续了

点开一个章节,寻找每一张图的地址(依然是老方法find包含所有图片的上一级然后find_all)

finalist_url=lage_url+href_s[1:]#拼接
        print(finalist_url)

先在最后一行悄悄加上这两行看看是不是又错了,没想到一次成功了,可以继续贴代码了

 import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    #print(href)
    lage_url='http://www.manhuatai.com'+href#href直接就是str
    #print(lage_url)
    lage_url_get=requests.get(lage_url,headers=headers)
    lage_url_soup=BeautifulSoup(lage_url_get.text,'lxml')
    #print(lage_url_soup)
    all_url=lage_url_soup.find('div',class_='mhlistbody').find_all('a')
    for a_a in all_url:
        title=a_a.get_text()
        href_s=a_a.get('href')
        #print(title,href_s)
        finalist_url=lage_url+href_s[1:]
        #print(finalist_url)
        finalist_url_get=requests.get(finalist_url,headers=headers)
        finalist_url_soup=BeautifulSoup(finalist_url_get.text,'lxml')
        picture_url=finalist_url_soup.find_all('img')
        print(picture_url)

直接找到最细致的地方瞅瞅,

什么。。又找不到

退回到更大的区间看看哪出问题了,

import requests
from bs4 import BeautifulSoup
import os
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    #print(href)
    lage_url='http://www.manhuatai.com'+href#href直接就是str
    #print(lage_url)
    lage_url_get=requests.get(lage_url,headers=headers)
    lage_url_soup=BeautifulSoup(lage_url_get.text,'lxml')
    #print(lage_url_soup)
    all_url=lage_url_soup.find('div',class_='mhlistbody').find_all('a')
    for a_a in all_url:
        title=a_a.get_text()
        href_s=a_a.get('href')
        #print(title,href_s)
        finalist_url=lage_url+href_s[1:]
        #print(finalist_url)
        finalist_url_get=requests.get(finalist_url,headers=headers)
        finalist_url_get.encoding='gkb'#居然又有乱码????换一个用
        finalist_url_soup=BeautifulSoup(finalist_url_get.text,'lxml')
        picture_url=finalist_url_soup.find('body')
        print(picture_url)

结果

很好,整了半天,惨遭反爬,一句,mmp。眼睁睁的看着图片的地址却无法动它分毫

依旧不甘心,一步一步往前回溯,用浏览器登上我自己拼接出的网址,仔细一看,原来拼错了

多了个bdzqxaj/但是别的漫画标题字符个数不一致,这时候就不能再用切片了,这时候掏出了re模块

这时候变成了这样

import requests
from bs4 import BeautifulSoup
import os
import re
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}#读写头
all_url='http://www.manhuatai.com/'#网址
start_html=requests.get(all_url,headers=headers)#获取网页内容
start_html.encoding='utf-8'#防止出现乱码有时候可以gbk换着用
Soup=BeautifulSoup(start_html.text,'lxml')#万能的beautifulsoup解析
#print(Soup)
all_a=Soup.find('div',class_="ulbox rhotbody").find_all('a')
for a in all_a:
    href=a['href']
    #print(href)
    lage_url='http://www.manhuatai.com'+href#href直接就是str
    #print(lage_url)
    lage_url_get=requests.get(lage_url,headers=headers)
    lage_url_soup=BeautifulSoup(lage_url_get.text,'lxml')
    #print(lage_url_soup)
    all_url=lage_url_soup.find('div',class_='mhlistbody').find_all('a')
    for a_a in all_url:
        title=a_a.get_text()
        href_s=a_a.get('href')
        #print(title,href_s)
        finalist_url=lage_url+re.sub("\D",'',href_s)+".html"
        #print(finalist_url)
        url_headers = {                
                    'Referer':finalist_url,
                    'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',                
                    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.2107.204 Safari/537.36'                
                    }
        finalist_url_get=requests.get(finalist_url,headers=url_headers)
        finalist_url_get.encoding='gbk'#再次出现乱码,只好再次使用,没想到utf-8无效了换成gbk
        print(finalist_url)

可以看见,网址都被抠出来了

由于此网址里的图片都是通过浏览而实时加载,且这些图片的地址都具有规律,因此再次拼接。。。但是之中都找不到,再此放弃待我学成归来




猜你喜欢

转载自blog.csdn.net/hrainning/article/details/80021537