python网页爬虫代码爬虫:如何爬网页数据并将其放在文本

Python爬虫: 抓取One网页上的每日一话和图 - Python - 伯乐在线
& Python爬虫: 抓取One网页上的每日一话和图
先说下需求:
最近打算搜集点源数据,丰富下生活。嗯,最近看到这个APP蛮好的。每天想你推送一张图和一段话。很喜欢,简单不复杂。而我想要把所有的句子都保存下来,又不想要每个页面都去手动查看。因此,就有了Python。之前有点Python基础,不过没有深入。现在也没有深入,用哪学哪吧。
网站的内容是这样的,我想要图片和这段话:
一台MAC电脑
(二)Python环境搭建(所有命令都是在terminal中输入的)
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装pip:这里我在terminal中输入python -v,homebrew会自动帮你升级Python到2.7.11版本的。2.7.11版本里自带了pip工具。
安装virtualenv:
pip install virtualenv
pip install virtualenv
安装request和beautifulsoup4:
pip install requests beautifulsoup4
pip install requests beautifulsoup4
(三)分析
目的:找出三个内容所在的网页标签的位置,然后将它们提取出来。
谷歌浏览器,右键-&显示网页源代码,然后就会弹出一堆HTML的东西了。这样的:
网页源文件
我想要的内容是这段话:“即使热恋者的情感是错觉、幻象或自恋行为,那又何妨,所谓人生就是一段不断追求情爱的路程。 by 森山大道”。它在图中画红线的地方。在&heda&标签里的&meta&中,之后会用到,先往下看。
图片的链接在哪里?显然不在&head&中,往下找,然后就在&body&中,发现2处和图片类似的链接。看图
图片链接地址
哪个链接是呢,点击去,发现后一个链接,也就是67行这个img标签的链接是。
然后,我还想知道哪一天的图和文字。嗯,在回到&head&标签里,很明显有个&title&,里面的东西就是我们要的。这样:
&title&VOL.1271 – 「ONE · 一个」&/title&
(四)python编码
想要抓取网页上的内容,又不想自己去解析HTML,只好求助万能的Google了。然后就找到了上面的。主要有两个工具:request加载网页,BeautifulSoup4解析HTML。
首先,抓取我们需要的哪三个内容:
进入python环境,然后敲入下面的代码:
import requests
import bs4
response = requests.get('http://wufazhuce.com/one/1295')
soup = bs4.BeautifulSoup(response.text,"html.parser")
import requestsimport bs4response = requests.get('http://wufazhuce.com/one/1295')soup = bs4.BeautifulSoup(response.text,"html.parser")
这样,就可以将网页信息存储到soup中了。你可以敲入print soup试试。
接下来,我们获得&title&VOL.1271 – 「ONE · 一个」&/title&中的数字1271。怎么获得呢,beautifulsoup4,提供了很好的方法,可以通过tag查找得到title的内容,然后截取字符串。termianl中输入:
soup.title.string[3:7]
soup.title.string[3:7]
title是tag值,string是tag=title的字符串的值,也就是&title&&/title&之间的值,因为只有一个&title&tag,所以不用做判断,直接获取即可。
接下来,获取一段话。
这段话在&meta&中,而这里又有太多的&meta&了,怎么办。这里要用到select方法了,它可以查找所有的&meta&,并返回一个列表。还要用到get方法,get可以获得tag的属性,如tag: &meta
attr=’abc’& tag.get(‘attr’)值等于abc。这里我们要获取的属性是name,通过name=’description’来区分。
for meta in soup.select('meta'):
if meta.get('name') == 'description':
print meta.get('content')
for meta in soup.select('meta'):&&&&if meta.get('name') == 'description':&&&&&&&&print meta.get('content')
接下来,在两个img标签中,查找第2个img标签标定的链接。这里通过find_all方法,它可以查找所有的符合要求的标签。
soup.find_all('img')[1]['src']
soup.find_all('img')[1]['src']
这样,我们就把所需要的信息找出来了。
等等,之后我们还需要并发和保存文件。在此之前,先来看点别的。map函数有两个参数,一个是函数,一个是序列。将序列的每个值,作为参数传递给函数,返回一个列表。参考
def echoInfo(num):
return num
data = map(echoInfo, range(0,10))
print data
def echoInfo(num):&&&&return num&data = map(echoInfo, range(0,10))print data
结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后, python可以跨平台使用,自身提供了多进程支持模块:multiprocessing。而pool可以用来创建大量的子进程。
保存数据到文件。这里我们是吧数据解析后存储到字典中,然后序列化为JSON模型,最后保存到文件的。
即:字典-&JSON模型-&存储到文件。
字典-&JSON模型,使用的是JSON模块的json.dumps方法,该方法有一个参数,参数为字典,返回值是JSON字符串。
JSON模型-&文件,使用的是json.load方法,可以将JSON存储到文件中。
全部的代码示例如下:
import argparse
from multiprocessing import Pool
import requests
import bs4
import time
import json
root_url = 'http://wufazhuce.com'
def get_url(num):
return root_url + '/one/' + str(num)
def get_urls(num):
urls = map(get_url, range(100,100+num))
return urls
def get_data(url):
dataList = {}
response = requests.get(url)
if response.status_code != 200:
return {'noValue': 'noValue'}
soup = bs4.BeautifulSoup(response.text,"html.parser")
dataList["index"] = soup.title.string[4:7]
for meta in soup.select('meta'):
if meta.get('name') == 'description':
dataList["content"] = meta.get('content')
dataList["imgUrl"] = soup.find_all('img')[1]['src']
return dataList
if __name__=='__main__':
pool = Pool(4)
dataList = []
urls = get_urls(10)
start = time.time()
dataList = pool.map(get_data, urls)
end = time.time()
print 'use: %.2f s' % (end - start)
jsonData = json.dumps({'data':dataList})
with open('data.txt', 'w') as outfile:
json.dump(jsonData, outfile)
123456789101112131415161718192021222324252627282930313233343536373839404142
import argparseimport refrom multiprocessing import Poolimport requestsimport bs4import timeimport jsonimport io&root_url = 'http://wufazhuce.com'&def get_url(num):&&&&return root_url + '/one/' + str(num)&def get_urls(num):&&&&urls = map(get_url, range(100,100+num))&&&&return urls&def get_data(url):&&dataList = {}&&response = requests.get(url)&&if response.status_code != 200:&&&&&&return {'noValue': 'noValue'}&&soup = bs4.BeautifulSoup(response.text,"html.parser")&&dataList["index"] = soup.title.string[4:7]&&for meta in soup.select('meta'):&&&&if meta.get('name') == 'description':&&&&&&dataList["content"] = meta.get('content')&&dataList["imgUrl"] = soup.find_all('img')[1]['src']&&return dataList&if __name__=='__main__':&&pool = Pool(4)&&dataList = []&&urls = get_urls(10)&&start = time.time()&&dataList = pool.map(get_data, urls)&&end = time.time()&&print 'use: %.2f s' % (end - start)&&jsonData = json.dumps({'data':dataList})&&with open('data.txt', 'w') as outfile:&&&&json.dump(jsonData, outfile)21:14 提问
Python 爬虫为什么只爬取到一个html页中的部分内容。
在用Python中urlopen和read直接获取到一个网页的HTML,为什么内容与通过浏览器的
查看网页源码的方式显示内容不一样呢,获取到的HTML只有原HTML部分内容。
按赞数排序
页面内容是异步加载的
你访问的的是开始部分。
浏览器有进行后续处理
你可以使用selenium,它可以模拟浏览器的webdriver
谢谢各位!我知道了。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐怎么把文本文件中的内容显示到网页上去??
[问题点数:0分]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:18039
本版专家分:2709
本版专家分:18039
本版专家分:2709
本版专家分:0
本版专家分:18039
本版专家分:0
本版专家分:18039
本版专家分:2818
2002年10月 扩充话题大版内专家分月排行榜第二
本版专家分:244367
2003年 总版技术专家分年内排行榜第五
2003年6月 总版技术专家分月排行榜第二2003年5月 总版技术专家分月排行榜第二
2003年9月 Web 开发大版内专家分月排行榜第一2003年7月 Web 开发大版内专家分月排行榜第一2003年6月 Web 开发大版内专家分月排行榜第一2003年5月 Web 开发大版内专家分月排行榜第一2003年4月 Web 开发大版内专家分月排行榜第一
2004年5月 Web 开发大版内专家分月排行榜第二2004年4月 Web 开发大版内专家分月排行榜第二2003年8月 Web 开发大版内专家分月排行榜第二2003年3月 Web 开发大版内专家分月排行榜第二
匿名用户不能发表回复!
其他相关推荐看完了《简明python教程》这本书,顿觉手痒,欲磨刀大干一番。
刚好今天看到一个人网站上的资料挺不错的,想要保存下来。可是文章又特别得多,要是我一次一次的去复制粘贴,这还不得累死人。于是乎就想放弃。但突然灵光一闪,之前一直听说python写爬虫什么的,便自己也一直想尝试着用python写一次,这不是正是一个好机会使用爬虫将文本爬下来的时候吗?(按照程序员的逻辑,哈哈)
于是便有了以下的工作。
因为我想爬的是一篇写作素材网站的内容,所以以下以这个网站为例:。
当然首先要现获取这个网址的代码:
url="http://www.mx-xz.com/sc-zl/fenlei/";
htmlr=requests.get(url);
首先我们看一下网站代码:
class="title"&
class="l"& href="http://www.mx-xz.com/show_4097.html" title="【江湖宝典】一些江湖术语及常见的名词解析" target="_blank" style="color:#e36c09"&【江湖宝典】一些江湖术语及常见的名词解析&&顶&&荐&&
class="r"&该写作素材对 &11906& 个作者有用&
class="intro"&十二经脉指人身手足三阴三阳十二经,包括手阳明、手少阳、手太阳、手太阴、手厥阴、手少阴、足阳明、足少阳、足太阳、足阴、足厥阴、足少阴共十二经脉。十二经脉运行于一身内外,遍布各处,不论是四肢、躯干、内脏无所…&
class="tagstime"&
class="l"&关键词:&
class="r"&入库&
在网站代码中有这样的代码块,我们需要从中分割出二级网址()和title内容。
然后使用BeautifulSoup分离出每一个以上的单独的代码块:
bsObjHtml=BeautifulSoup(htmlr.text);
for titlelist in bsObjHtml.findAll("div",{"class":"title"}):
再根据每一个单独的部分获取网址和标题:
urltext=titlelist.a["href"];
filename=titlelist.a["title"];
根据获得的二级网址继续爬:
rtext=requests.get(urltext);
bsObjtext=BeautifulSoup(rtext.text);
filetext=bsObjtext.find("div",{"id":"sdcms_content"});
接着就是打开本地文件,然后保存内容了:
fp=open(filepath+filename+".txt","w");
fp.write(tool.replace(filetext.__str__()));
当然还有一部重要的内容,也就是tool。因为网页代码会有很多标签如&p&,所以保存之前要删除掉这些标签,于是就有了tool:
class Tool:
removeImg = re.compile(| {7}|')
removeAddr = re.compile(|')
replaceLine = re.compile(|||')
replaceTD= re.compile(')
replacePara = re.compile(')
replaceBR = re.compile(|')
removeExtraTag = re.compile(')
def replace(self,x):
x = re.sub(self.removeImg,"",x)
x = re.sub(self.removeAddr,"",x)
x = re.sub(self.replaceLine,"\n",x)
x = re.sub(self.replaceTD,"\t",x)
x = re.sub(self.replacePara,"\n
x = re.sub(self.replaceBR,"\n",x)
x = re.sub(self.removeExtraTag,"",x)
return x.strip()
下面放上全部代码:
Created on
@author: manbu
import requests
from bs4 import BeautifulSoup
filepath="F:/temp_xiaoshuo/";
class Tool:
removeImg = re.compile('&img.*?&| {7}|')
removeAddr = re.compile('&a.*?&|&/a&')
replaceLine = re.compile('&tr&|&div&|&/div&|&/p&')
replaceTD= re.compile('&td&')
replacePara = re.compile('&p.*?&')
replaceBR = re.compile('&br&&br&|&br&')
removeExtraTag = re.compile('&.*?&')
def replace(self,x):
x = re.sub(self.removeImg,"",x)
x = re.sub(self.removeAddr,"",x)
x = re.sub(self.replaceLine,"\n",x)
x = re.sub(self.replaceTD,"\t",x)
x = re.sub(self.replacePara,"\n
x = re.sub(self.replaceBR,"\n",x)
x = re.sub(self.removeExtraTag,"",x)
return x.strip()
tool=Tool()
url="http://www.mx-xz.com/sc-zl/fenlei/";
htmlr=requests.get(url);
bsObjHtml=BeautifulSoup(htmlr.text);
for titlelist in bsObjHtml.findAll("div",{"class":"title"}):
if (titlelist.a != None):
urltext=titlelist.a["href"];
filename=titlelist.a["title"];
fp=open(filepath+filename+".txt","w");
rtext=requests.get(urltext);
bsObjtext=BeautifulSoup(rtext.text);
filetext=bsObjtext.find("div",{"id":"sdcms_content"});
fp.write(tool.replace(filetext.__str__()));
fp.close();
总算大功告成,由于第一次接错python,还有许多不完美的地方,哈哈,不过可以自动化保存文档的内容是实现了。欣喜。依稀想起一位大神说过的话:懒惰是人类进步的源泉。
如何把Python爬取的网页保存为.txt文件
注意问题:涉及到中文时一定要在前面加 #encoding: utf-8
获取网页要知道返回的类型,可以先用type()方法去验证返回的数据类型
# encoding: utf-8
import ...
Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量
Python并不是我的主页,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处。
这两天闲...
Python爬虫入门 | 6 将爬回来的数据存到本地
1.用Python语句存储数据写文件时,我们主要用到 with open() 语句:with open(name,mode,encoding) as file:
file.write()
Python-爬取小说文字内容(使用beautiful soup实现)
Python-爬取小说文字内容(beautiful soup)
本次爬取的网站为[http://www.136book.com/][6],你可以在页面选择你想要爬取的小说。
文中代码使用Anaco...
python网页全部内容的获取
1、升级pip的版本2、安装requests包3、前两步才可以引用requests包例子import requests
res = requests.get('http://news.sina.com...
对于一个python新手,要使用scrapy进行爬虫,简直是抓狂,不过一点一点的啃下来,慢慢的发现也挺有意思的,通过好几天的白天去公司实习,晚上熬夜到凌晨写...
function fileimport()
var selectedFile = document.getElementById(&files&).file...
读取文本文件:
选择文件:
file组件的属性:
accept(能接受的附件):
accept=&video/*&
---只能选择影音文件
accept=&audio/*&
Python爬虫实例–爬取百度贴吧小说写在前面
本篇文章是我在简书上写的第一篇技术文章,作为一个理科生,能把仅剩的一点文笔拿出来献丑已是不易,希望大家能在指教我的同时给予我一点点鼓励,谢谢。
本人比较喜欢看小说但是网络上在线看的比较多,txt文本形式的比较少,简单写个抓取文本,写文件
如有意见建议
希望能提出来共同进步
没有更多推荐了,

我要回帖

更多关于 python爬虫网页有安全证书 的文章

 

随机推荐