2018.11.24如何使用python爬取网页内容

1.确定目标网站的user_agent,和需要爬取页面内容的网址,user-agent可以在百度上收索UA查询,即可得到你的用户代理。
2.我们爬取下来的页面内容可能含有很多html语言标记,为了让页面更加清晰可读,我们需要将这标记除去,只保留我们需要的文本内容。通常有两种方法:
(1)将爬取下来的页面保存为html文件,使用浏览器打开就可以进行阅读
(2)使用htm解析器,将页面中的内容抽取出来,保存为我们需要的任意格式文件,如csv文件。
第一种方式只适用于简单的爬取,大多数情况下,我们采取第二种方式。
python中常用与html解析的库有两个,分别是lxml和BeautifulSoup
3.\d+意思是匹配一个或多个数字,这里的\d+被称作元字符,不加+号,表示只匹配一个数字
路径前面的r表示不要对‘\’进行转义。‘\’表示转义字符,如果不需要转义,有两种方法,一种是前面加斜杠,另一种是前面加‘r’
4使用狄利克雷分布进行话题提取(Lantent Dirichlet Allocation,LDA)
在这里插入图片描述(1)
#导入request库
import requests
#指定我们的User Agent
user_agent=‘User-Agent,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0’
headers={‘User-Agent’:user_agent}

#向服务器发送请求
r=requests.get(“http://www.gov.cn/zhengce/content/2018-11/23/content_5342665.htm”,headers=headers)

#将爬取的内容打印出来,这里只是得到了我们爬取的页面,即html文件,但是出现了乱码?
print(r.text)
#使用编码查询方式
print(r.encoding)
#发现编码错误,与页面的编码不一致,改成一样就可以
#修改编码
r.encoding=‘utf-8’
print(r.text)

#但是爬取的页面有太多的html语言,那么怎么让爬取的页面清晰可读呢?
#有两种方法:第一种就是将这个页面保存为html文件,这样就可以用浏览器打开
#第二种方法使用html解析器,将页面中的重要内容抽取出来,保存为我们需要的任意格式的文件。

#第一种方法
#先指定保存html文件的路径,
with open(r’F:\MyCode\Python\paquwejian\request_one.html’,‘w’,encoding=‘utf-8’) as f:
#将文本写入
f.write(r.text)
#运行代码后会发现指定的路径下产生了一个新的html文件

#如何爬取更为复杂的内容——第二种方式
#使用html解析器只抓取标题文本和对应的链接——正则表达式
#使用re模块调用正则表达式供能

import re
#指定匹配模式为从开始位置匹配数字
pattern=re.compile(r’\d+’)
result1=re.match(pattern,‘你说什么都是对的2333333’)
if result1:
print(result1.group())#匹配成功打印内容
else:
print(“匹配失败”)
result2=re.match(pattern,‘233333你说什么都是对的’)
if result2:
print(result2.group())
else:
print(‘匹配失败’)

#使用search方法可以在任意位置匹配到我们想要的结果

result3=re.search(pattern,‘你说什么23445665都是对的’)
if result3:
print(result3.group())
else:
print(‘匹配失败’)

#使用split方法将数字之间的文本拆分出来
print(re.split(pattern,‘你说双击666666都是对的2333333哈哈哈’))
#使用findall方法把提取数字
print(re.findall(pattern,‘你说双击666666都是对的2333333哈哈哈’))

#接下来使用BeautifulSoup进行HTML解析
#python中常用的两个用于HTML解析的库:lxml\beautifulSoup

from bs4 import BeautifulSoup
soup=BeautifulSoup(r.text,‘lxml’,from_encoding=‘utf-8’)
print(soup)

#提取对应的内容,比如标题
print(soup.title)
#发现提取的类容还是包含html标记,使用string或者get_text()来提取文字部分
print(soup.title.string)
print(soup.title.get_text())

#提取正文内容

标记表示段落
print(soup.p.string)#这里默认只提取了第一

中的内容
#我们使用BeautifulSoup中的find_all()方法来提取所有的

标记中的内容

print("======================================")
texts=soup.find_all(‘p’)
for text in texts:
print(text.string)

#上面介绍了如何抓捕文本内容,现在介绍如何抓取链接
#找到倒数第一个标签
link=soup.find_all(‘a’)[-1]
print(link.get(‘herf’))

(2)
#导入request库
import requests
#导入CSV库便于我们把抓取内容保存到csv文件
import csv
#导入BeautifulSoup
from bs4 import BeautifulSoup
#导入正则表达式库
import re

#定义用户的爬虫User Agent
user_agent=‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0’
headers={‘User-Agent’:user_agent}

#使用request向服务器发送请求
polices=requests.get(‘http://www.gov.cn/zhengce/zuixin.htm’,headers=headers)
#指定编码格式与爬取页面内容的编码格式一致
polices.encoding=‘utf-8’
#创建html问价解析对像
p=BeautifulSoup(polices.text,‘lxml’)
#使用正则表达式匹配所有包含content单词的链接
contents=p.find_all(href=re.compile(‘content’))

#定义一个空列表用来存储每一个数据链接和标题
rows=[]
#使用for循环对每个数据中的文本共和链接进行提取
for content in contents:
href=content.get(‘href’)
row=(‘国务院’,content.string,href)
#将提取出来的文本和链接加入到空列表中
rows.append(row)

#定义需要保存的CSV文件头
header=[‘发文部门’,‘标题’,‘链接’]
#建立一个名叫polices.csv的文件,以写入模式打开,将编码设置为gb18030,否则会出现乱码
with open(‘F:\MyCode\Python\paquwejian\polices.csv’,‘w’,encoding=‘gb18030’) as f:
f_csv=csv.writer(f)
#写入文件头
f_csv.writerow(header)
#写入内容列表
f_csv.writerows(rows)
print(“文件以保存,轻查看!”)

(3)
#对文本数据进行话题提取
#当我们爬取的内容比较多时,即使保存在本地,也需要花很多的时间去阅读
#那么我们怎么样才能快速的了解一段文字的核心内容?使用
#Latent Dirichlet Allccation来对文本进行话题提取

#导入requests库
import requests
#导入解析工具
from bs4 import BeautifulSoup
#导入正则表达式
import re
#导入时间库
import time
#获取爬虫的用户代理
user_agent=‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0’
header={‘User-Agent’:user_agent}

#创建一个空列表用来保存爬取的每一条数据

all_jokes=[]

for i in range(1,120):#设置爬虫爬取的页面范围
content=requests.get(‘http://duanziwang.com/’,headers=header)
#替换网页中
标签
replaced=content.text.replace(’
’,’’).replace(’
’,’’).replace(’
’,’’)
#使用解析工具提取正文内容
soup=BeautifulSoup(replaced,‘lxml’)
jokes=soup.find_all(‘div’)
for joke in jokes:
text=joke.string
all_jokes.append(text)
#打印正爬取的页面
print(‘正在爬取第{}页’.format(i))
#设置每爬取一页,休眠1秒,避免给服务器带来过大的负担
time.sleep(1)
print(‘爬取完成’)
#以写入模式爬取下来的文件保存到下面的路径中
with open(‘F:\MyCode\Python\paquwejian\joke.txt’,‘w’,encoding=‘utf-8’) as f:
for j in all_jokes:
f.write(str(j))
f.write(’\n’)

#接下来我们使用Latent Dirichlet Alloaton进行文本话题提取

#载入保存好的txt文档,并将文本数据提取出来

file=open(‘F:\MyCode\Python\paquwejian\joke.txt’,‘r’,encoding=‘utf-8’)

#读取文本的所有行

lines=file.readlines()

#提取出文本中的字符串数据

line=str(lines)

#使用结巴分词工具对文本进行处理

import jieba

line=jieba.cut(line)

#在分词中加入空格

x=’ '.join(line)

#保存为另一个txt文件

with open(‘F:\MyCode\Python\paquwejian\cutjoke.txt’,‘w’,encoding=‘utf-8’) as f:

f.write(x)

#接下来对进行分词处理过的txt文件进行话题提取

#使用向量化工具 CountVectorizer或者是TfidfVectorizer

#导入TfidfVectorizer模型

from sklearn.feature_extraction.text import TfidfVectorizer

#导入LDA模型

from sklearn.decomposition import LatentDirichletAllocation

#定义一个函数用来打印提取后的话题和高频词汇

def print_topic(model,feature_names,n_top_words):

for topic_idx,topic in enumerate(model.components_):

message=‘topic #%d:’ % topic_idx

message +=’ '.join([feature_names[i] for i in topic.argsort()[:-n_top_words-1:1]])

print(message)

print()

#载入分词处理过的文本

f=open(‘F:\MyCode\Python\paquwejian\cutjoke.txt’,‘r’)

#定义每个话题提取20个高频词汇

n_top_words=20

#TfidfVectorizer最大特征数为1000

tf=TfidfVectorizer(max_features=1000)

#将转化为向量的文本数据作为训练数据

x_train=tf.fit_transform(f)

#指定LDA模型提取10个话题

lda=LatentDirichletAllocation(n_components=10)

lda.fit(x_train)

#打印结果

print_topic(lda,tf.get_feature_names(),n_top_words)

猜你喜欢

转载自blog.csdn.net/qq_40258282/article/details/84451142
今日推荐