landchina数据爬取
从简书里(https://www.jianshu.com/p/97c7e903acad)学习,爬取本地市19年度的土地出让记录。
python 本来也没太多接触,里面涉及几个方面的内容:
proxy:
这是为了规避大量爬取landchina数据导致被封IP而提及的代理,我这边只是爬取少量,不需要用到。
redis
远程字典服务,之前没有接触,作者用这个应该是为了分布式的爬取,实际上我是不需要的,不过为了了解该知识,也蛮用了一下。
r = redis.Redis(host='127.0.0.1', port=6379, db=0) # host自己的ip地址
注意要下载Redis-server,并运行,redis官网上没有win版本,需要去github上下载。
chrome driver
这边调用的是chrome 的无界面浏览,下载跟机子上安装的chrome一致的chromedriver,国内淘宝有镜像(http://npm.taobao.org/mirrors/chromedriver/)
下载后设置path就好。至于里面的chrome options,headless等方法的变化,按提示改下就好。
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options) # 打开chrome_headless浏览器
pymongo
这个也是一个nosql,这边没用到,有空再去了解一下mongo。
Beautiful Soup
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
xlwt
这个是python里的一个excel库,查下资料可以现学现用。
get cookie & createHeaders
打开一个网页获得一个cookie,并构造出一个header,用于发送get请求,获取详细的土地供应信息页面。
retry
@retry(tries=5, delay=2) #出错重试5次,延迟2秒
倒不一定用到,后面我把他注释掉,不然一开始再调试的时候,因为有错误,一直跳出新的chromedriver,我还以为是分布式多线程的因素。。。
详细的代码如下:
main1.py
#coding=utf-8
import time
import re
import redis
from bs4 import BeautifulSoup
from selenium import webdriver
import random
import sys
import requests
r = redis.Redis(host='127.0.0.1', port=6379, db=0) # host自己的ip地址
chrome_options = webdriver.ChromeOptions()
#chrome_options.add_argument('--proxy-server=http://' + proxy)
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options) # 打开chrome_headless浏览器
driver.get('http://www.landchina.com/default.aspx?tabid=263&ComName=default') # 打开界面
i = 1
l = 0
date_list = []
time.sleep(8)
driver.find_element_by_id('TAB_QueryConditionItem270').click()
def page_zh(i, l):
# 获取本时间段内的总页数(方法)int(reg[0])
zys = driver.find_elements_by_css_selector(".pager")
if (zys != []):
str = zys[1].text;
reg = re.findall(r'\d+', str)
pages = int(reg[0])
print("总页数为:" + reg[0])
tds = driver.find_elements_by_css_selector(".pager>input")
# 清空文本方法
tds[0].clear()
tds[0].send_keys(i)
print("第" + tds[0].get_attribute("value") + "页")
tds