python爬虫连载分享【1】
目标:爬取58同城商品的标题,地区,分类,时间,浏览量。
工具:requests,beautifulsoup
涉及问题:浏览量的爬取
导入必要模块
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import json
url='http://xa.58.com/pbdn/0/'
获取特定页的所有链接
def get_links_from(who_sells):
urls=[]
list_view='http://bj.58.com/pbdn/% s/'%(str(who_sells))
wb_data=requests.get(list_view)
soup=BeautifulSoup(wb_data.text,'lxml')
for link in soup.select('td.t a.t'):
urls.append(link.get('href'))
return urls
获取浏览量
def get_views_from(url):
id = url.split('/')[-1].split('?')[0].strip('x.shtml')
api='http://jst1.58.com/counter?infoid=%s'%(id)
header = {
'User-Agent':xxx
'Referer':xxx
'Cookie':xxx
js = requests.get(api, headers=header)
views = js.text.split('=')[-1]
return views
```
获取每页的信息
def get_items_info(who_sells=0):
urls = get_links_from(who_sells)
for url in urls:
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
data = dict(title=soup.title.text, price=soup.select('.price')
[0].text,
area=list(soup.select('span.c_25d')[0].stripped_strings) if
soup.find_all('span','c_25d') else None,
cate='个人' if who_sells == 0 else '商家',
views=get_views_from(url),
time=soup.find('li', class_='time').text)
print json.dumps(data, ensure_ascii=False, encoding='UTF-
8')
所有的代码如上所示,值得一提的是浏览量的抓取并没有那么简单。如果按照标签直接抓取,会是0,因为js控制的原因。
如果弄chrome浏览器,可以在network里找到有一页控制浏览量的文件。
![Paste_Image.png](https://img.haomeiwen.com/i2033563/8f156c76fd4e439a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在右边的preview我们可以看到浏览量如下:
![Paste_Image.png](https://img.haomeiwen.com/i2033563/080cae5988d364f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
于是断定浏览量被此url进行控制,在header中加入referer
![Paste_Image.png](https://img.haomeiwen.com/i2033563/05ee0a73eb0b0892.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
便可获取浏览量。
为了对付反盗链,需要伪造的referer:
防盗链就是需要在请求的头部加入Referer字段, Referer 指的是HTTP头部的一个字段, 用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着 HTTP Referer 头部网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。
更多关于Referer:http://bindog.github.io/blog/2014/11/18/http-referer-security-and-anti-anti-hotlink/
网友评论