python爬虫百度文库源码(python百度文库下载)
怎么使用python爬取百度网的数据
档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长进,更重要的是通过和能人交流,以更高的眼界更宏观的看待数据、应用以及问题,这就是成长)。 我之前采用的方式,可以满足需求,但是POI数据获取效率差一些(虽然已经很快,但是相比本文这种还是慢一些)、数据现势性不好,高德数据和百度数据虽然是两套,但是仅仅是坐标不同(所以显然还是一套)。所以,我加一种方式来爬取百度poi。
一 调研: 百度API提供了一个叫Place API获取poi的接口,有个城市内检索 实例为
ce/v2/search?query=银行page_size=10page_num=0scope=1region=北京output=jsonak={您的密钥}
它返回的是个json类型数据,一个区域最大返回数为400,每页最大返回数为20。显然一个城市内不管什么类别的poi,不可能只有400个,会遗漏数据,故舍去
还有一个矩形区域检索,实例为
u.com/place/v2/search?query=美食page_size=10page_num=0scope=1bounds=39.915,116.404,39.975,116.414output=jsonak={您的密钥}只要区域划分得当,这个可以使用
二 要解决的问题
1 区域划分
网上有人通过递归写代码的方式来划分,这样划分有问题,第一,划分的区域不能完全对应一个城市的市区;第二,算法设计比较麻烦。解决办法,后面详细说。
2 类别问题
百度API的接口必须要指定query的类别,那么如果类别指定不准,或者类别不全,根本无法完成爬取一个城市所有poi的任务。解决办法,说实话,这个问题在我做这件事情的时候,
十分棘手,不过我最终找到了这个网页
/index.php?title=lbscloud/poitags,一切都不是问题了
三 整体流程
1 区域划分,2km*2km的区域基本可以满足需求,获取每个区域的对角坐标(经纬度),逐行写入一个txt文本里
2 爬虫程序编写 读取1中的txt文本,逐行循环;调用百度API接口,爬取json;将爬取的数据存入数据库中; 每个类别跑一次程序
3 爬下的POI数据处理 poi显示,投影坐标转换,与地图叠加
后文将详细介绍流程
python爬虫怎么获取动态的网页源码
一个月前实习导师布置任务说通过网络爬虫获取深圳市气象局发布的降雨数据,网页如下:
心想,爬虫不太难的,当年跟zjb爬煎蛋网无(mei)聊(zi)图的时候,多么清高。由于接受任务后的一个月考试加作业一大堆,导师也不催,自己也不急。
但是,导师等我一个月都得让我来写意味着这东西得有多难吧。。。今天打开一看的确是这样。网站是基于Ajax写的,数据动态获取,所以无法通过下载源代码然后解析获得。
从某不良少年写的抓取淘宝mm的例子中收到启发,对于这样的情况,一般可以同构自己搭建浏览器实现。phantomJs,CasperJS都是不错的选择。
导师的要求是获取过去一年内深圳每个区每个站点每小时的降雨量,执行该操作需要通过如上图中的历史查询实现,即通过一个时间来查询,而这个时间存放在一个hidden类型的input标签里,当然可以通过js语句将其改为text类型,然后执行send_keys之类的操作。然而,我失败了。时间可以修改设置,可是结果如下图。
为此,仅抓取实时数据。选取python的selenium,模拟搭建浏览器,模拟人为的点击等操作实现数据生成和获取。selenium的一大优点就是能获取网页渲染后的源代码,即执行操作后的源代码。普通的通过 url解析网页的方式只能获取给定的数据,不能实现与用户之间的交互。selenium通过获取渲染后的网页源码,并通过丰富的查找工具,个人认为最好用的就是find_element_by_xpath("xxx"),通过该方式查找到元素后可执行点击、输入等事件,进而向服务器发出请求,获取所需的数据。
[python]?view plain?copy
#?coding=utf-8
from?testString?import?*
from?selenium?import?webdriver
import?string
import?os
from?selenium.webdriver.common.keys?import?Keys
import?time
import?sys
default_encoding?=?'utf-8'
if?sys.getdefaultencoding()?!=?default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
district_navs?=?['nav2','nav1','nav3','nav4','nav5','nav6','nav7','nav8','nav9','nav10']
district_names?=?['福田区','罗湖区','南山区','盐田区','宝安区','龙岗区','光明新区','坪山新区','龙华新区','大鹏新区']
flag?=?1
while?(flag??0):
driver?=?webdriver.Chrome()
driver.get("hianCe/")
#?选择降雨量
driver.find_element_by_xpath("//span[@id='fenqu_H24R']").click()
filename?=?time.strftime("%Y%m%d%H%M",?time.localtime(time.time()))?+?'.txt'
#创建文件
output_file?=?open(filename,?'w')
#?选择行政区
for?i?in?range(len(district_navs)):
driver.find_element_by_xpath("//div[@id='"?+?district_navs[i]?+?"']").click()
#?print?driver.page_source
timeElem?=?driver.find_element_by_id("time_shikuang")
#输出时间和站点名
output_file.write(timeElem.text?+?',')
output_file.write(district_names[i]?+?',')
elems?=?driver.find_elements_by_xpath("//span[@onmouseover='javscript:changeTextOver(this)']")
#输出每个站点的数据,格式为:站点名,一小时降雨量,当日累积降雨量
for?elem?in?elems:
output_file.write(AMonitorRecord(elem.get_attribute("title"))?+?',')
output_file.write('\n')
output_file.close()
driver.close()
time.sleep(3600)
文件中引用的文件testString只是修改输出格式,提取有效数据。
[python]?view plain?copy
#Encoding=utf-8
def?OnlyCharNum(s,?oth=''):
s2?=?s.lower()
fomart?=?'abcdefghijklmnopqrstuvwxyz0123456789,.'
for?c?in?s2:
if?not?c?in?fomart:
s?=?s.replace(c,?'')
return?s
def?AMonitorRecord(str):
str?=?str.split(":")
return?str[0]?+?","?+?OnlyCharNum(str[1])
一小时抓取一次数据,结果如下:
python怎么看源码进行网络爬虫
在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。
我们最常规的做法就是通过鼠标右键,选择另存为。但有些图片鼠标右键的时候并没有另存为选项,还有办法就通过就是通过截图工具截取下来,但这样就降低图片的清晰度。好吧~!其实你很厉害的,右键查看页面源代码。
我们可以通过python 来实现这样一个简单的爬虫功能,把我们想要的代码爬取到本地。下面就看看如何使用python来实现这样一个功能。
一,获取整个页面数据
首先我们可以先获取要下载图片的整个页面信息。
getjpg.py
#coding=utf-8
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
html = getHtml("")
print html
Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据。首先,我们定义了一个getHtml()函数:
urllib.urlopen()方法用于打开一个URL地址。
read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
二,筛选页面中想要的数据
Python 提供了非常强大的正则表达式,我们需要先要了解一点python 正则表达式的知识才行。
假如我们百度贴吧找到了几张漂亮的壁纸,通过到前段查看工具。找到了图片的地址,如:src=””pic_ext=”jpeg”
修改代码如下:
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
return imglist
html = getHtml("")
print getImg(html)
我们又创建了getImg()函数,用于在获取的整个页面中筛选需要的图片连接。re模块主要包含了正则表达式:
re.compile() 可以把正则表达式编译成一个正则表达式对象.
re.findall() 方法读取html 中包含 imgre(正则表达式)的数据。
运行脚本将得到整个页面中包含图片的URL地址。
三,将页面筛选的数据保存到本地
把筛选的图片地址通过for循环遍历并保存到本地,代码如下:
#coding=utf-8
import urllib
import re
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
x+=1
html = getHtml("")
print getImg(html)
这里的核心是用到了urllib.urlretrieve()方法,直接将远程数据下载到本地。
通过一个for循环对获取的图片连接进行遍历,为了使图片的文件名看上去更规范,对其进行重命名,命名规则通过x变量加1。保存的位置默认为程序的存放目录。
程序运行完成,将在目录下看到下载到本地的文件。
python爬虫源代码没有但检查
python爬虫源代码没有但检查可以通过5个步骤进行解决。
1、提取列车Code和No信息。
2、找到url规律,根据Code和No变化实现多个网页数据爬取。
3、使用PhantomJS模拟浏览器爬取源代码。
4、用bs4解析源代码,获取所需的途径站数据。
5、用csv库存储获得的数据。
python,求一个简单的selenium+re的网页源码爬取
网页爬取不一定要用Selenium,Selenium是为了注入浏览器获取点击行为的调试工具,如果网页无需人工交互就可以抓取,不建议你使用selenium。要使用它,你需要安装一个工具软件,使用Chrome浏览器需要下载chromedriver.exe到system32下,如使用firefox则要下载geckodriver.exe到system32下。下面以chromedriver驱动chrome为例:
#?-*-?coding:UTF-8?-*-
from?selenium?import?webdriver
from?bs4?import?BeautifulSoup
import?re
import?time
if?__name__?==?'__main__':
options?=?webdriver.ChromeOptions()
options.add_argument('user-agent="Mozilla/5.0?(Linux;?Android?4.0.4;?Galaxy?Nexus?Build/IMM76B)?AppleWebKit/535.19?(KHTML,?like?Gecko)?Chrome/18.0.1025.133?Mobile?Safari/535.19"')
driver?=?webdriver.Chrome()
driver.get('url')#你要抓取百度文库的URL,随便找个几十页的替换掉
html?=?driver.page_source
bf1?=?BeautifulSoup(html,?'lxml')
result?=?bf1.find_all(class_='rtcspage')
bf2?=?BeautifulSoup(str(result[0]),?'lxml')
title?=?bf2.div.div.h1.string
pagenum?=?bf2.find_all(class_='size')
pagenum?=?BeautifulSoup(str(pagenum),?'lxml').span.string
pagepattern?=?re.compile('页数:(\d+)页')
num?=?int(pagepattern.findall(pagenum)[0])
print('文章标题:%s'?%?title)
print('文章页数:%d'?%?num)
while?True:
num?=?num?/?5.0
html?=?driver.page_source
bf1?=?BeautifulSoup(html,?'lxml')
result?=?bf1.find_all(class_='rtcspage')
for?each_result?in?result:
bf2?=?BeautifulSoup(str(each_result),?'lxml')
texts?=?bf2.find_all('p')
for?each_text?in?texts:
main_body?=?BeautifulSoup(str(each_text),?'lxml')
for?each?in?main_body.find_all(True):
if?each.name?==?'span':
print(each.string.replace('\xa0',''),end='')
elif?each.name?==?'br':
print('')
print('\n')
if?num??1:
page?=?driver.find_elements_by_xpath("//div[@class='page']")
driver.execute_script('arguments[0].scrollIntoView();',?page[-1])?#拖动到可见的元素去
nextpage?=?driver.find_element_by_xpath("//a[@data-fun='next']")
nextpage.click()
time.sleep(3)
else:
break
执行代码,chromedriver自动为你打开chrome浏览器,此时你翻页到最后,点击阅读更多,然后等一段时间后关闭浏览器,代码继续执行。
「python爬虫保姆级教学」urllib的使用以及页面解析
使用urllib来获取百度首页的源码
get请求参数,如果是中文,需要对中文进行编码,如下面这样,如果不编码会报错。
urlencode应用场景:多个参数的时候。如下
为什么要学习handler?
为什么需要代理?因为有的网站是禁止爬虫的,如果用真实的ip去爬虫,容易被封掉。
2.解析技术
1.安装lxml库
2.导入lxml.etree
3.etree.parse() 解析本地文件
4.etree.HTML() 服务器响应文件
5.解析获取DOM元素
1.路径查询
2.谓词查询
3.属性查询
4.模糊查询
5.内容查询
6.逻辑运算
示例:
JsonPath只能解析本地文件。
pip安装:
jsonpath的使用:
示例:
解析上面的json数据
缺点:效率没有lxml的效率高
优点:接口设计人性化,使用方便
pip install bs4 -i
from bs4 import BeautifulSoup
1.根据标签名查找节点
soup.a.attrs
2.函数
find(‘a’):只找到第一个a标签
find(‘a’, title=‘名字’)
find(‘a’, class_=‘名字’)
find_all(‘a’) :查找到所有的a
find_all([‘a’, ‘span’]) 返回所有的a和span
find_all(‘a’, limit=2) 只找前两个a
obj.string
obj.get_text()【推荐】
tag.name:获取标签名
tag.attrs:将属性值作为一个字典返回
obj.attrs.get(‘title’)【常用】
obj.get(‘title’)
obj[‘title’]
示例:
使用BeautifulSoup解析上面的html