小白一枚,最近开始学习爬虫。跟大家分享一下。
本文以爬取python100例为对象
一、爬虫的匹配方式有四种
1、正则表达式
2、CSS
3、beautiful soup
4、xpath
二、爬虫的基本步骤如下:
第一步:
先获取url((URL,是指“Uniform Resource Locator”的缩写,即统一bai资源定位符。)),表示网址
from bs4 import BeautifulSoup#导入所需要的包
import requests
import pandas as pd
url = 'https://www.runoob.com/python/python-100-examples.html'#要爬取的网页地址
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}##header可通过右击审查元素中的network,点击刷新,选择最上面自己的网址,然后下滑到最后一个user-agent
第二步:
r = requests.get(url,headers=headers).content.decode('utf-8')#直接获取会造成乱码,对获取来的文件进行解码,是指获取请求,可以进行爬虫
#print(r)
#解析html文档,获取后的文档为乱码,需要对它进行解码,一般解码为lxml格式
soup = BeautifulSoup(r,'lxml') #解析文档为lxml模式
#print(type(soup))
re_a = soup.find(id='content').ul.find_all('a') #返回的是100个a标签的列表,因为要爬取里面的每一个链接。
#创建一个列表保存url
lis = []
for i in re_a:
lis.append(i.attrs['href'])
#print(lis)
第三步:
获取要爬取的每个页面的内容
datas = []
for x in lis:
dic = {}
#请求详细页面
ar = requests.get('https://www.runoob.com'+x,headers=headers).content.decode('utf-8')
#解析为html文档
soup_ar = BeautifulSoup(ar,'lxml')
#查找练习内容,里面的内容都可以通过审查元素中的代码进行查找
#a.查找标题
dic['title'] = soup_ar.find(id='content').h1.text
#b.查找题目
dic['m'] = soup_ar.find(id='content').find_all('p')[1].text
#c.查找程序分析
dic['cxfx'] = soup_ar.find(id='content').find_all('p')[2].text
#d.查找程序源代码
try:
dic['code'] = soup_ar.find(class_='hl-main').text
except Exception as e:
dic['code'] = soup_ar.find('pre').text
第四步:保存文件
#保存文件
with open('100-py.csv','a+',encoding='utf-8') as file:
file.write( dic['title'] +'\n')
file.write( dic['m'] +'\n')
file.write( dic['cxfx'] +'\n')
file.write( dic['code'] +'\n')
file.write('*'*50+'\n')#表示设置分割符号
这就是一个简单的爬虫程序了,下面是自己跟着教程自己用另外两种匹配方式进行编写的
css
'''
获取URL(URL,是指“Uniform Resource Locator”的缩写,即统一bai资源定位符。)
表示网址
1.获取Python100的URL
2.练习的URL
'''
from bs4 import BeautifulSoup
import requests
import pandas as pd
url = 'https://www.runoob.com/python/python-100-examples.html'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}#通过在网址的界面点击审查元素之后network之后选择header的最后一行所获取到的
#发送请求
r = requests.get(url,headers=headers).content.decode('utf-8')#直接获取会造成乱码,对获取来的文件进行解码
#print(r)
#解析html文档
soup = BeautifulSoup(r,'lxml') #解析文档为lxml模式
#print(type(soup))
#查找每个练习的a链接的herf属性获取对应的链接地址
re_a = soup.select('#content ul li a') #返回的是100个a标签的列表
# print(re_a)
#创建一个列表保存url
lis = []
for i in re_a:
lis.append(i.attrs['href'])
#print(lis)
'''
2.根据获取的每个练习的链接地址来请求每个练习获得页面内容
'''
datas = []
for x in lis:
dic = {}
# #请求详细页面
ar = requests.get('https://www.runoob.com'+x,headers=headers).content.decode('utf-8')
# #解析为html文档
soup_ar = BeautifulSoup(ar,'lxml')
# #查找练习内容
#a.查找标题
dic['title'] = soup_ar.select('#content h1')[0].text
print(dic['title'])
# #b.查找题目
dic['m'] = soup_ar.select('#content p')[1].text#表示p标签的第二个
#print(dic['m'])
#c.查找程序分析
dic['cxfx'] = soup_ar.select('#content p')[2].text#表示p标签中的第三个
print(dic['cxfx'])
#d.查找程序源代码
try:
dic['code'] = soup_ar.find(class_='hl-main').text
except Exception as e:
dic['code'] = soup_ar.find('pre').text
#datas.append(dic)
# data = pd.DataFrame(datas)
# data.to_csv('py-100.csv')
#保存文件
with open('100-py.csv','a+',encoding='utf-8') as file:
file.write( dic['title'] +'\n')
file.write( dic['m'] +'\n')
file.write( dic['cxfx'] +'\n')
file.write( dic['code'] +'\n')
file.write('*'*50+'\n')#表示设置分割符号
#print(dic)
xpath
'''
获取URL(URL,是指“Uniform Resource Locator”的缩写,即统一bai资源定位符。)
表示网址
1.获取Python100的URL
2.练习的URL
'''
from bs4 import BeautifulSoup
import requests
import pandas as pd
from lxml import etree
url = 'https://www.runoob.com/python/python-100-examples.html'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}#通过在网址的界面点击审查元素之后network之后选择header的最后一行所获取到的
#发送请求
r = requests.get(url,headers=headers).content.decode('utf-8')#直接获取会造成乱码,对获取来的文件进行解码
#print(r)
#解析html文档
soup = etree.HTML(r)
print(type(soup))
result = etree.tostring(soup,pretty_print=True,encoding='utf-8').decode('utf-8')
soup_url = soup.xpath('//div[@class="article-intro"]/ul/li/a/@href')
#print(soup_url)
'''
2.根据获取的每个练习的链接地址来请求每个练习获得页面内容
'''
for x in soup_url:
#请求详细页面
ar = requests.get('https://www.runoob.com'+x,headers=headers).content.decode('utf-8')
#解析为html文档
html = etree.HTML(ar)
# 查找练习内容
# a.查找标题
title = html.xpath('string(//div[@class="article-intro"]/h1[1])')
#print(title)
#b.查找题目
m = html.xpath('string(//div[@class="article-intro"]/p[2])')#表示p标签的第二个
#print(m)
#c.查找程序分析
cxfx = html.xpath('string(//div[@class="article-intro"]/p[3])')#表示p标签中的第三个
#print(cxfx)
code = html.xpath('string(//*[@id="content"]/div/div/div)')
#print(code)
#保存文件
with open('110-py.csv','a+',encoding='utf-8') as file:
file.write( title +'\n')
file.write( m +'\n')
file.write( cxfx +'\n')
file.write( code +'\n')
file.write('*'*50+'\n')#表示设置分割符号
#print(dic)
最后是自己第一次尝试写的一个小的爬虫例子:
#自己写的第一个爬虫例子
from bs4 import BeautifulSoup
import requests
import pandas as pd
from lxml import etree
url = 'https://blog.youkuaiyun.com/mj_zm/article/details/108522966?utm_medium=distribute.pc_category.none-task-blog-hot-1.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-1.nonecase&request_id='
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}#通过在网址的界面点击审查元素之后network之后选择header的最后一行所获取到的
r = requests.get(url,headers=headers).content.decode('utf-8')#直接获取会造成乱码,对获取来的文件进行解码
#解析html文档
soup = etree.HTML(r)
#print(type(soup))
result = etree.tostring(soup,pretty_print=True,encoding='utf-8').decode('utf-8')
#即可获得全篇内容
tm = soup.xpath('string(//div[@id="content_views"])')
#print(tm1)
#保存内容
with open('first-py.csv','a+',encoding='utf-8') as file:
file.write(tm +'\n')
1800



被折叠的 条评论
为什么被折叠?



