简单的记录一下,近期来学习Python 的成果。这里,自学了Python基础和抓包实战。
视频地址:https://blaclacloud.coding.net/p/tcshare/files/all
首先简单描述一下,抓包实现的功能。
-
首先,根据python,利用request 包,获取整个页面内的目标链接。
-
其次,利用第一步收获的url数组,for 循环来处理每个页面。
-
其后,再for 循环内,抓取目标块,将其保存到本地。
这里,我们获取了html的内容,将其全部直接保存成 .html 文件,方便直接预览。
代码
##导入依赖
import requests
import time
import re
from bs4 import BeautifulSoup
#获取页面上的links
def get_links(url):
responce=requests.get(url)
soup=BeautifulSoup(responce.text,'lxml')
link_div=soup.find('div',class_='news-list-col')
links_all=link_div.find_all('a')
links_get=[a.get('href') for a in links_all]
links=links_get[10:]
#### 得到所有的最新链接--不是完整的。links_get[10:]去除前面的10条广告链接
return links
#获取单页面的内容
def get_title_all(url):
responce=requests.get('host{}'.format(url))
soups=BeautifulSoup(responce.text,'lxml')
result=re.search('article', url)
link_title_dow=''
link_title=''
link_title_img=''
if(result): ####匹配两种模式的页面
link_title=soups.find('div',class_='inform-title-txt')
else:
link_title_but=soups.find('div',class_='inform-button')
link_title_dow=link_title_but.find('a')
link_title=soups.find('div',class_='inform-title')
link_title_img=soups.find('div',class_='inform-img')
#将页面的标题、下载链接、标题图片连接在一起
link='{}<br>{}<br>{}<br>'.format(link_title,link_title_dow,link_title_img)
return link
#### 解析网页页面,获取标题
def get_connect_all(url):
responce=requests.get('https://www.kjsv.com{}'.format(url))
soups=BeautifulSoup(responce.text,'lxml')
link_div=soups.find('div',class_='inform-intr')
return link_div
#### 解析网页页面,获取内容块
now_name=time.strftime("%m-%d", time.localtime())
#保存位置 时间+站点
file_path='./get_html/{}-kjsv.html'.format(now_name)
print('创建文件位置{}'.format(file_path))
links_all=get_links('host')
#开始循环
for link in links_all:
link_con_a=str(get_connect_all(link))
link_title_a=str(get_title_all(link))
link_con=link_con_a.replace("/download/","//host/download/")
link_title=link_title_a.replace("/download/","//host/download/")
#保存单次获取的内容保存
with open(file_path,'a+',encoding='UTF-8',errors='ignore') as f:
contents=f.write('<br><br><hr><b>'+str(link_title)+'</b>\n')
contents=f.write(str(link_con)+'\n<hr>')
print('输出一条信息')
思路与解析
首先,整个小项目包含2个大函数,对应3个小函数。
| 函数 | 目的 |
|---|---|
| get_links | 获取整个页面上所有有用的链接,通常是首页 |
| get_connect_all | 获取子页面的文本内容 |
| get_title_all | 获取子页面的标题 |
这里,get_connect_all和 get_title_all本质上一致,但是由于案例项目的特殊性,采取单获取标题和内容。
python 代码方法解析
def get_links(url):
#请求requests.get方法,请求整个页面的html代码
responce=requests.get(url)
#BeautifulSoup 解析html
soup=BeautifulSoup(responce.text,'lxml')
#soup.find 查找元素及类
link_div=soup.find('div',class_='news-list-col')
#.find_all 获取所有的a标签代码,包含href内容
links_all=link_div.find_all('a')
#for 循环清理href ,获取单链接
links_get=[a.get('href') for a in links_all]
return links
这里,着重讲一下 soup.find 和 soup.find_all 的区别。
soup.find:
获取该字段内的第一个特征元素,一般适用于获取页面 html 的唯一一个、独一无二的元素。id值和class按需求填写
| class写法 | find(‘div’,class_=’news-list-col’) |
|---|---|
| id写法 | find(‘div’,id=’news-list’) |
这里,记得find前面的soup格式为lxml
soup.find_all
获取字段内的所有满足条件的值,返回数组的形式。那么,得到的结果是字典格式。
