为什么python爬虫的数据里有好几个\\n(python中爬出来的内容为什

http://www.itjxue.com  2023-03-28 03:11  来源:未知  点击次数: 

为什么Python写的爬虫有时候抓取的数据是乱码

# -*- coding:utf-8 -*-

import urllib2

import re

url=''

#打开页面并进行转码

page=urllib2.urlopen(url).read().decode('gbk')

print 'Open %s'%url

#去掉超链接和图片

none_re=re.compile('a href=.*?|/a|img.*?')

#换行符转换

br_re=re.compile('br')

#标题

title_re=re.compile('h1 class="core_title_txt " title="(.*?)"')

#帖子内容

content_re=re.compile('div id="post_content_\d*" class="d_post_content j_d_post_content "(.*?)/div')

#搜索文章标题,并去掉文件标题可能含有的特殊符号

title=re.search(title_re,page)

title=title.group(1).replace('\\','').replace('/','').replace(':','').replace('*','').replace('?','').replace('"','').replace('','').replace('','').replace('|','')

#搜索文本内容

content=re.findall(content_re,page)

with open('%s.txt'%title,'w') as f:

print 'Writing %s.txt now...'%title

for i in content:

#对html特殊符号进行替换处理

i=re.sub(none_re, '', i)

i=re.sub(br_re, '\n', i)

#写入文本文件

f.write(i.encode('utf-8').strip()+'\n')

print 'Done!'

python爬虫爬取只显示10个

一个借口几万条数据但是只返回十条_爬虫实践之爬取10000条菜谱数据

2020-12-03 06:37:24

weixin_39990029

码龄5年

关注

be22f93fc7bbc7cbdd62166579a1fd22.png

爬虫实践之XX行代码爬取10000菜谱数据

什么是爬虫

爬虫:又叫做 网络蜘蛛,是一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。

点击这里了解Python爬虫介绍

如何合法地爬虫

有些网站不允许网络爬虫,或是对可爬取的内容做了限制,一个网站的爬虫协议可通过访问该网站的robots.txt文件获得

以豆瓣网为例

访问该网址(),可了解到豆瓣的爬虫协议如下

1fe03008a450885dc6da49785543e75c.png

可以看到,豆瓣对于不同的访问者有不同的访问限制,其中对于用户名为 Wandoujia Spider的访问者,豆瓣不允许访问。

我用到的菜谱网站对爬虫无限制,所以爬虫是合法的。

e4025d9f5d8b96388efa942e0255d1f9.png

本篇特色

连续爬取10000个网页

引入第三方库

import requests #发送请求

import re #正则表达式,用于提取网页数据

import winsound #提醒程序运行结束

import time #计算程序运行时间

如果没有安装这些第三方库,可以在命令提示符中输入如下代码,进行下载

pip install requests,re,winsound,time

爬虫的三个步骤

获取要爬取的所有网页的网址

提取网页内容中的有用信息

信息导出

每个步骤对应一个函数

Step_1 获取要爬取的所有网页的网址

首先我们打开该网址,查看它的源代码

0f0eb8b89c9bf17460bca4d47f017bab.png

365621d25c80f92834853350c083a545.png

网页源代码

观察发现每道菜对应的网址在这个目录下

9d729b843df3a746d70ea7af31a1d962.png

用正则表达式获得该网址,写入列表中

由于每一个网页只有十道菜,点击下一页后发现网页的变化规律为换页时网址只有数字改变

d342d8422e16c48c9600a47a45a6d1c9.png

可以看到最多有1000页,也就是有10000道菜

fb279b42fcdd3cecf7cda79ba4a8ae53.png

使用循环,将每一页的菜对应的网址都写入列表,每一次写入时写入一行列表,多次写入后,形成一个二维的列表,前两页的菜谱网址在二维列表中显示如下:

31e3755dc8b45ec6f4dac3c05f261539.png

代码如下

all_url = [] #创建一个数组用于存储网页地址

def get_all_url(n): #这个函数用于获得网页中的菜的全部网址

if(n==1):

url = ""

else:

url=''%n #%s相当于C语言中的%s,表示格式化一个对象为字符,同理%d表示格式化一个对象为整数

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)

AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" }

response = requests.get(url,headers=headers) #访问网页

response.encoding = "utf-8" #设置接收编码格式

pattern = re.compile(r'a target="_blank" href="([a-zA-z]+://[^s]*)"', re.S)

#正则表达式提取网页中的网址,re.S表示在整个文本中进行匹配,如果不加re.S,将只在一行进行匹配

result = pattern.findall(response.text) #获取的网页结果存储到result里

all_url.append(result[0:10])#由于每页只有十道菜,result中只有前十条对应的是菜的网址,故我们只添加前十条

return all_url #作为返回值返回这个列表

关于headers的说明

在使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设置,User-Agent会声明自己是python脚本,而如果网站有反爬虫的想法的话,必然会拒绝这样的连接。而修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问,来避免这一问题。 点击这里了解详情

关于编码格式utf-8 的说明

utf-8,可以编码中文,大部分python编译器都默认编码方式为utf-8 点击这里了解详情

Step_2 提取网页中的有用信息

打开一道菜的网址,查看源代码,寻找我们需要的信息在哪里,然后用正则表达式获取,流程与上个函数获取网址相同

主辅料信息在这里

c0ddfd3110775bb8b71759f6927f26d4.png

特征信息在这里(包括做法和口味)

38c99c1a51137debcafe38ae3122e19a.png

def get_info(resp,output):

name_pattern = re.compile(r'h1(.*)/h1')# 正则表达式获取菜名信息

food_pattern = re.compile(r'span class="t"(.*)/spanspan class="a"(.*)/span/a/div')# 正则表达式获得主料信息

fixing_pattern = re.compile(r'div class="c_mtr_li"span class="t1"(.*)/spanspan class="a"(.*)/span/div') # 正则表达式获得辅料信息

fearture1_pattern = re.compile(r'div class="cpargs cpargs2"div class="i"/div(.)/div')# 正则表达式获得特征_1

fearture2_pattern = re.compile(r'div class="cpargs cpargs3"div class="i"/div(.*)/div')# 正则表达式获得特征_2

name = name_pattern.findall(resp.text) # 提取菜名信息

food = food_pattern.findall(resp.text)# 提取主料信息

fixing = fixing_pattern.findall(resp.text)#提取辅料信息

fearture1 = fearture1_pattern.findall(resp.text) #提取特征_1

fearture2 = fearture2_pattern.findall(resp.text)#提取特征_2

output.write(str(name))#将菜名写入output文件,write函数不能写int类型的参数,所以使用str()转化

output.write('t')#进入下一个单元格

output.write(str(fearture1))#将特征_1写入output文件

output.write('t')#进入下一个单元格

output.write(str(fearture2))#将特征_2写入output文件

output.write('t')#进入下一个单元格

for i in range(len(food)):

for j in range(len(food[i])):

output.write(str(food[i][j])) #写入主料

output.write('t')

if(len(food)11):

output.write('t'*2*(11-len(food))) #每道菜的主料数目不同,该行代码可使表格内容对齐

for i in range(len(fixing)):

for j in range(len(fixing[i])):

output.write(str(fixing[i][j])) #写入辅料

output.write('t')

output.write('n') #换行

Step_3 信息导出

def spider():

output = open('E:programingpython苏菜_2.xls','w',encoding='utf-8')#创建一个excel文件,编码格式为utf-8

output.write('名称t做法t特色t主料')#写入标题栏

output.write('t'*22)#使内容对齐

output.write('辅料n')#写入标题栏

for i in range(len(all_url)):

for j in range(len(all_url[i])):

url2=all_url[i][j]

response = requests.get(url2)#逐个访问网页,获得数据

response.encoding = "utf-8" #设置接收编码格式

get_info(response,output)#处理数据,提取信息

output.close()#关闭文件

主函数

time_start = time.time()#记录程序开始时间

for i in range(1,2):#逐页获取菜谱网页信息

get_all_url(i)

spider()#进行提取处理并导出

duration = 1000#提示音时长,1000毫秒 = 1秒

freq = 440 #提示音频率

time_end=time.time()#记录程序结束时间

print('totally cost',time_end-time_start)#打印程序运行时间

winsound.Beep(freq,duration*10) #响铃提示程序结束

经实验,爬取10000条代码需要用时3453秒左右

e8b6c8637980d2aef9587711c7084a5f.png

最后获得的数据如下

97a8662cf048844850658aef841e04c3.png

写在后面

我是一个C语言上不了80的小白,全靠某度和某歌东拼西凑我的这个程序,在代码风格与写作等方面存在不可避免地会有一些错误和不足的地方,希望大家多多与我交流,多多批评指教我。

python爬虫输出到text遇到\u3000\u3000等字符

import?re

s?=?'lia?class="nav-first"?href="/"\u3000\u3000首页\n?a//li'

r?=?re.findall(u'[\u4e00-\u9fa5].+?',?s)

print(r)

输出结果:['首页']

为什么python爬虫抓取网页内容,抓取到的是一堆代码,没有js的内容

mport urllib.request

import re

def getHtml(url):

page = urllib.request.urlopen(url)

html = page.read()

html = html.decode('GBK')

return html

def getMeg(html):

reg = re.compile(r'******')

meglist = re.findall(reg,html)

for meg in meglist:

with open('out.txt',mode='a',encoding='utf-8') as file:

file.write('%s\n' % meg)

if __name__ == "__main__":

html = getHtml(url)

getMeg(html)

python爬虫获取有负载内容

之前给大家介绍了Python爬虫库requests的发送请求传参等使用方法,在requests模块中,它的操作方法可以有很多,比如获取响应内容、响应状态码、响应头等相关信息,下面一起来学习这篇有关“Python爬虫库requests如何获取响应内容?requests模块可以获取到哪些响应内容?”的文章吧,希望对大家的学习有更多的帮助。

?

我们在使用模块之前,都会对它进行导入操作,requests模块也不例外,导入的方法如下:

import requests

一、获取响应的内容

在Python不同的类型中,响应的内容也会有所不同,而在我们对网页发送一个请求的时候,服务器就会给我们返回响应的内容,并且使用requests它就会对我们的这个内容进行自动解码操作。

1、文本响应内容

Requests库中,它可以对一个文本的响应进行获取,代码如下:

r = requests.get('')

r.text

这里是通过text文本的形式获取响应内容。不仅如此它还可以使用encoding来获取一个响应内容的编码以及还可以对编码进行修改。方法如下:

r.encoding

输出编码格式为:

'ISO-8859-1'

2、二进制响应内容

Requests不仅可以对一个文本进行响应,还可以对一个二进制内容进行响应,使用方法很简单,如下:

r.content

只需要通过content方法,获取的内容就是一个二进制类型的文件响应。

有关Python爬虫库requests如何获取响应内容?requests模块可以获取到哪些响应内容?的学习到这里就结束了,想要学习Python爬虫库requests的知识可以继续关注哦,会每天给大家更新不一样内容。

(责任编辑:IT教学网)

更多

推荐Frontpage教程文章