看完一周python爬虫的视频,已经对爬虫的基本思路有了一定的了解。现在以爬取煎蛋网的图片并下载在本地为目标阐述爬虫的基本思路。
目标: 连续爬取并下载煎蛋网站的无聊栏目的图片
所需库:bs4模块的BeautifulSoup、requests、urllib.request
第一部分 准备工作
第一步: 我们分析一下我们所需要的元素的标签信息。
整个网站的图片分两种:第一种是静态的图片.jpg或.png或其他相类似的静态图,第二种是.gif动态图。动态图我们暂时不需要(以后我会学怎么抓动态图),我们需要的是静态图,然后通过chrome的检查功能我们发现,所有的图片都有这样的cssPath:#comment-3769757 > div > div > div.text > p > img, 实际上我们使用 div.text > p > img就可以定位到每一张图片了。
路径选择方法如下图: 在chrome中对网页进行检查然后选中某个标签->右键->然后如下。
第二步:我们需要的是不仅仅是一个页面的数据,我们需要的是多个页面的数据。我们针对简单的网页进行简单的分析。
它的url格式如下:http://jandan.net/pic/page-(页码)
第二部分 正式工作
第一步: 我们导入所需要的库文件
第二步:使用requests.get(url,headers=header)方法(header是用于伪装成浏览器的字符串,具体文章如下见)将html文件down下来
参考文章:https://blog.csdn.net/Cooler_max/article/details/79193386 在使用requests库的情况下如何伪装成浏览器
第三步: 使用BeautifulSoup对下载下来的网页进行解析,然后使用select方法选取我们所需要的标签:div.text > p > img。最后使用get('src')方法将其中的网页链接取出,生成一个list。
第四步: 我们使用如下代码对取得的img网址进行下载
for
imgurl
in
imglist:
# 写好你的路径
urllib.request.urlretrieve(imgurl,
'D:\\test\\%s.jpg'
%
x,Schedule)
x
+
=
1
第五步: 我们返回到第二步对第二步使用的url进行修改(改页码)然后让电脑重复二三四过程,直到网页爬取完毕。
结束语: 刚开始接触python爬虫,写的东西的可能有点杂乱,逻辑性不强,大家也就随便看看,如果能帮助到大家是最好的。如果有错误也希望大家能够指正。
附一个写好的例子(目标网址 : https://weheartit.com)
from bs4 import BeautifulSoup
import requests
import urllib.request
import sys
import io
import time
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding = 'gb18030')
#print(soup) 已经证明能够正常的输出 文字没有问题
path = 'C:/Users/Administrator/Desktop/img/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36',
'Cookie' : 'locale=zh-cn; __whiAnonymousID=8f2b8ec6e965428885d5c497f4fda3b3; __qca=P0-1916917309-1522726427209; __gads=ID=2bf79b99f08ad583:T=1522726511:S=ALNI_Ma6oCky909e_Y9U-Y6-RxAFfTuthQ; _weheartit_anonymous_session=%7B%22page_views%22%3A3%2C%22search_count%22%3A0%2C%22last_searches%22%3A%5B%5D%2C%22last_page_view_at%22%3A1523349133807%7D; auth=no; _whisession=b5ed7f4417adfbd20a91c5745a874dbb; _ga=GA1.2.662950764.1522726426; _gid=GA1.2.1818819622.1523348785; _gat=1'
}
import urllib
def cbk(a, b, c):
'''回调函数
@a: 已经下载的数据块
@b: 数据块的大小
@c: 远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100:
per = 100
print('%.2f%%' % per)
def get_pic(url):
wb_data = requests.get(url, headers=headers)
soup = BeautifulSoup(wb_data.text, 'lxml')
# img path selector #div > div.article-info-overlay > a
images = soup.select('div > div > a > img')
img_urls = []
for image in images:
img_urls.append(image.get('src'))
print(image.get('src'))
return img_urls
def dl_img_url(url):
if url is not None:
index = url.find('?')
if index != -1:
str_len = len(url)
url = url[:-(str_len-index)]
urllib.request.urlretrieve(url,path + url.split('/')[-2] + url.split('/')[-1])
print('Done')
else:
print('Url is None')
def get_more_pages(start,end):
for one in range(start,end):
url = 'https://weheartit.com/recent?page={}'.format(one)
img_urls = get_pic(url)
for img_url in img_urls:
dl_img_url(img_url)
time.sleep(3)
get_more_pages(1, 3)