python基础之爬虫入门

python基础爬虫主要针对一些反爬机制较为简单的网站,是对爬虫整个过程的了解与爬虫策略的熟练过程。

爬虫分为四个步骤:请求,解析数据,提取数据,存储数据。本文也会从这四个角度介绍基础爬虫的案例。

一、简单静态网页的爬取

我们要爬取的是一个壁纸网站的所有壁纸

http://www.netbian.com/dongman/

1.1 选取爬虫策略——缩略图

首先打开开发者模式,观察网页结构,找到每一张图对应的的图片标签,可以发现我们只要获取到标黄的img标签并向它发送请求就可以得到壁纸的预览图了。

随后注意到网站不止一页,打开前3页的网站观察url有没有规律

http://www.netbian.com/dongman/index.htm#第一页
http://www.netbian.com/dongman/index\_2.htm#第二页
http://www.netbian.com/dongman/index\_3.htm#第三页

我们发现除了第一页其他页数的url都是有着固定规律的,所以先构建一个含有所有页数url的列表

  url\_start \= 'http://www.netbian.com/dongman/'
    
  url\_list\=\['http://www.netbian.com/dongman/index.htm'\]
    
  if not os.path.exists('./exercise'):
    
  os.mkdir('./exercise')
    
 for i in range(2,133):
    
  url \= url\_start+'index\_'+str(i)+'.htm'
    
  url\_list.append(url)

至此我们的基本爬虫策略就确定了。

网页请求

for url in url\_list:
    
 headers \= {
    
    
    
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    
}
    
 response \= requests.get(url\=url,headers\=headers).text
    

解析数据

在这里我们选用etree解析数据

  tree \= etree.HTML(response)

提取数据

在这里我们选用xpath提取数据

 leaf \= tree.xpath('//div\[@class="list"\]//ul/li/a/img/@src')
    
 for l in leaf:
    
 print(l)
    
 h \= requests.get(url\=l, headers\=headers).content
    

存储数据

  i \= 'exercise/' + l.split('/')\[-1\]
    
 with open(i, 'wb') as fp:
    
  fp.write(h)
    

完整代码

import requests

from lxml import etree

import os

url_start = 'http://www.netbian.com/dongman/'

url_list=['http://www.netbian.com/dongman/index.htm']

#http://www.netbian.com/dongman/index_2.htm

if not os.path.exists('./exercise'):

os.mkdir('./exercise')

for i in range(2,133):

url = url_start+'index_'+str(i)+'.htm'

url_list.append(url)

print(url_list)

for url in url_list:

headers = {
    
    

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

}

response = requests.get(url=url,headers=headers).text

tree = etree.HTML(response)

leaf = tree.xpath('//div[@class="list"]//ul/li/a/img/@src')

for l in leaf:

print(l)

h = requests.get(url=l, headers=headers).content

i = 'exercise/' + l.split('/')[-1]

with open(i, 'wb') as fp:

fp.write(h)

1.2 选取爬虫策略——高清大图

在刚刚的爬虫中我们爬取到的只是壁纸的缩略图,要想爬到高清版本,就需要我们更改策略。重新打开开发者工具进行观察,发现在原先爬取的img标签之上还有一个href标签,打开之后就会跳转高清大图。

那么此时我们的爬取策略就变成了提取这个href标签的内容,向这个标签中的网站发送请求,随后在该网站中找到img标签进行再一次请求。

我们用到了正则表达式来提取href标签的内容。正则表达式是比xpath语法更简便的一种数据提取方法,具体有关语法可查看以下文档

for url in url_list:

headers = {
    
    

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

}

response = requests.get(url=url,headers=headers).text

leaf = re.findall("desk/\d*.htm",response,re.S)

for l in leaf:

url = "http://www.netbian.com/"+str(l)

h = requests.get(url=url, headers=headers).text

leaf_ =re.findall('<div class="pic">.*?(http://img.netbian.com/file/\d*/\d*/\w*.jpg)',h,re.S)

这样输出的leaf_就是我们要找的高清大图的img标签,此时我们只需要再次发送请求随后再保存数据就可以了。

存储数据

for l_ in leaf_:

print(l_)

h = requests.get(url=l_, headers=headers).content

i = 'exercise/' + l_.split('/')[-1]

with open(i, 'wb') as fp:

fp.write(h)

完整代码

import requests

import os

import re

url_start = 'http://www.netbian.com/dongman/'

url_list=['http://www.netbian.com/dongman/index.htm']

if not os.path.exists('./exercise'):

os.mkdir('./exercise')

for i in range(2,133):

url = url_start+'index_'+str(i)+'.htm'

url_list.append(url)

print(url_list)

for url in url_list:

headers = {
    
    

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

}

response = requests.get(url=url,headers=headers).text

leaf = re.findall("desk/\d*.htm",response,re.S)

for l in leaf:

url = "http://www.netbian.com/"+str(l)

h = requests.get(url=url, headers=headers).text

leaf_ =re.findall('<div class="pic">.*?(http://img.netbian.com/file/\d*/\d*/\w*.jpg)',h,re.S)

for l_ in leaf_:

print(l_)

h = requests.get(url=l_, headers=headers).content

i = 'exercise/' + l_.split('/')[-1]

with open(i, 'wb') as fp:

fp.write(h)

二、动态加载网站的爬取

我们要爬取的是另一个壁纸网站的所有壁纸

https://sucai.gaoding.com/topic/9080?

2.1 选取爬虫策略——selenium

首先打开开发者模式,观察网页结构,此时我们会发现一页上的所有壁纸并不是全部都加载出来了的,也就是说随着我们下拉滚动条,内容会不断实时加载出来,查看网页元素时也能看到lazy-image这个代表动态加载的标签

由于是动态加载,因此不能用之前的直接发送请求的办法来爬取数据了,面对这种情况我们就需要模拟浏览器发送一个请求,并且下拉页面,来实现爬取一个实时加载网页的目的。

观察完网页结构之后我们又来观察页数,这次就不多说了,想必大家也能发现规律

url_list=[]

for i in range(1,4):

url = 'https://sucai.gaoding.com/topic/9080?p={}'.format(i)

url_list.append(url)

网页请求

在这里我们用到了selenium这个自动化测试框架

for url in url_list:

driver = webdriver.Chrome()

driver.get(url)

driver.maximize_window()

time.sleep(2)

i=0

while i<10:#下拉滚动条加载页面

i+=1

driver.execute_script("window.scrollBy(0,500)")

driver.implicitly_wait(5)#显式等待

解析提取数据

items = driver.find_elements_by_xpath("//*[@class='gdd-lazy-image__img gdd-lazy-image__img--loaded']")

for item in items:

href = item.get_attribute('src')

print(href)

至于数据的存储只需要再请求我们爬下来的href标签的网站就可以了。

完整代码

from selenium import webdriver

import time

import os

if not os.path.exists('./exercise'):

os.mkdir('./exercise')

headers = {
    
    

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36'

}

url_list=[]

url_f_list=[]

for i in range(1,4):

url = 'https://sucai.gaoding.com/topic/9080?p={}'.format(i)

url_list.append(url)

for url in url_list:

driver = webdriver.Chrome()

driver.get(url)

driver.maximize_window()

time.sleep(2)

i=0

while i<10:

i+=1

driver.execute_script("window.scrollBy(0,500)")

driver.implicitly_wait(5)#显式等待

items = driver.find_elements_by_xpath("//*[@class='gdd-lazy-image__img gdd-lazy-image__img--loaded']")

for item in items:

href = item.get_attribute('src')

print(href)

【想要学习爬虫的朋友们 我这里整理了很多Python学习资料上传到CSDN官方了,有需要的朋友可以扫描下方二维码进行获取】

一、学习大纲

在这里插入图片描述

二、开发工具

在这里插入图片描述

三、Python基础材料

在这里插入图片描述

四、实战资料

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Z987421/article/details/133354722