您的位置:首页 > 编程语言 > Python开发

Python爬虫的一些小技巧

2017-04-19 18:00 246 查看
最近在写毕设,毕设是关于网络爬虫这一块的。大学期间做的项目都是关于Java应用程序开发这一块的, 这次不想再写那些烂大街的管理系统了,不如试试别的。正逢导师给出参考题目,于是选了其中一个关于做搜索平台的。其实当下关于写爬虫的框架都不少,最初的时候爬虫最多使用Python写,后来渐渐的由于Java优秀的特性,后来也有了用Java实现的优秀框架。这里前期也没学过Python,所以选择了Python来写(是的,没学过,所以用它写,没毛病)。这次就把这些天来体会较深的一些地方记下来。

在刚开始看了近一个星期的Python语法和实际有关爬虫的一些论文和实现方案,以及一些操作视频,整个过程不算顺利,但是也算是自研道路上的进阶了,紧接着就开搞了。现在项目写了一半多了吧,其中有些问题都开始忘了。

问题一:如何提取目标数据

这一点算是比较基础的问题。其实只要只要学过网页相关的知识或者没接触过也可以很快上手。

首先要清楚要写的爬虫的目的是要从网络上获取数据,怎么获取?这就是跟平时打开浏览器浏览网页时是一回事,用户不管是在点击一个链接还是点击功能按钮后浏览器向服务器发出一个请求,最后将请求到的相关数据返回给客户端,浏览器获取到后展示出请求到的内容。

        同样今天要用程序去实现,不过就是将人换成了程序,由程序去发请求,最后获取服务器返回的数据,这就是爬虫所做的事。在这个过程中,关键就是观察在常规浏览器中展示的网页时什么样的结构。也就是说通过请求可得到与网页结构是一致的所有数据。But,这些都是静态写在网页上的数据。直观来说就是查看源代码内容 = 请求得到的内容。

问题二:请求被禁

        这个问题纠结了较长时间,最初以为可以通过设置请求头的方式,告诉服务器发请求的确实是浏览器来解决。但总觉得之前都可以找到特定请求就得到数据,这次应该也可以,不如找找别的请求有没有同样数据的加载,或者可以找找别的界面应该也是可以找到的。最后都试过,主要项目一些业务逻辑的问题,所以还是选择用试试这种添加请求头的方式,果然请求到了。

获得商品价格
def getPrice_fromTB(c_id):
url =TB_DETAIL_PRICE.format(c_id)
headers['Referer'] = headers['Referer'].format(c_id)
web_data = requests.get(url, headers=headers)
web_data.encoding = web_data.apparent_encoding
soup = BeautifulSoup(web_data.text, 'lxml').text
price_list = re.findall('\"price\":\"(.*?)\",', soup)
price = float(price_list[-1])
# print(price)
return price


      这里因为最后获取到的json数据格式错误,只能通过正则表达式提取出数据。正常来说是可以通过Python的字符串转json的方法实现,但是前提是字符串的格式要正确,验证格式可以到这里(http://www.bejson.com/jsonviewernew/),复制粘贴格式化验证就知道结果。

问题三:大规模爬取数据
      其实爬取数据并不困难,问题是如何爬取大规模数据。这里可以借用多线程,也可以采用优秀的异步框架tornado,然后要知道的是一个代理频繁访问在很多网站都是会被禁的,所以势必要先去获取一些代理,随便爬取100个可用的代理基本上就可以完成几十万条数据每小时的任务。

        (注:爬取网页一些公开或不违反网站协议的一些数据作数据分析基本是没什么问题的,但切忌利用爬虫程序非法获取一些重要数据或资料并作为商业用途。有关法律法规可参看相关文件。)











                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: