Python爬虫

  博主目前学习Python爬虫,主要从简单的代码入手,然后逐步理解爬虫的精髓,逐渐学习复杂的爬虫技术等内容。

  本文主要研究使用简单的线程、urllib、bs4.BeautifulSoup等爬取链家网站二手房信息。主要的原理在于链家网站具有比较简单的网页结构,同时也是静态网页;使用的手段,主要是通过网页之间的地址链接,不断获取房子详细页面的内容。

主要用到的包

本文主要使用以下package:

import Queue

import MysqlDB
import parserURL

import threading
import time
import urllib

from bs4 import BeautifulSoup

使用的线程信息,但由于存在链家可能存在反扒措施,或对同一IP存在访问数限制,因此这里主要使用单一线程。

主要代码

浏览页面网页解析:

## 解析网页信息
class parserURL(threading.Thread):
    
    counts = 0
    preurl = ""
    
    def __init__(self, html_queue, two_html_queue):
        threading.Thread.__init__(self)
        self.html_queue = html_queue
        self.two_html_queue = two_html_queue

    def run(self):
        while True:
            try:
                self.detail_url_parser()
                self.counts = self.counts + 1
                if self.counts % 100 == 0:
                    time.sleep(60)
            except Exception:
                self.html_queue.put(self.preurl)
                print "parserURL: Hello, world"
    
    def detail_url_parser(self):
        s = self.html_queue.get()
        print "parserURL: ", s
        self.preurl = s
        s = urllib.urlopen(s).read()
        s = BeautifulSoup(s, 'html.parser').find('ul', attrs={'class':'house-lst'})
        lis = s.find_all('li')
        
        for li in lis:
            detail = li.find('h2').find('a')
            detail_href = detail['href']
            self.two_html_queue.put("http://sh.lianjia.com" + detail_href)

解析房子详细页面信息,并将爬取内容写入数据库:

sql = "insert into house_infos(tag,type,total_price,house_type,house_area,house_avg_price,house_floor,house_year,house_desc,house_direction,first_pay,monthly_pay,district,district_address,city) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
## 解析二手房信息
class parserErShouFang(threading.Thread):
    
    counts = 0
    preurl = ""
    
    def __init__(self, db, tag, city, house_type, html_queue):
        threading.Thread.__init__(self)
        self.html_queue = html_queue
        self.db = db
        self.tag = tag
        self.city = city
        self.house_type = house_type
        
    def run(self):
        while True:
            try:
                self.ershoufang_html()
                self.counts = self.counts + 1
                if self.counts % 500 == 0:
                    time.sleep(60)
            except Exception:
                print "parserErShowFang: Hello, world!"
                self.html_queue.put(self.preurl)
    
    def ershoufang_html(self):
        param = []

        h = self.html_queue.get()
        self.preurl = h
        print "sdf: ", h
        s = urllib.urlopen(h).read()
        s = BeautifulSoup(s, 'html.parser')
        
        param.append(self.tag)
        param.append(self.house_type)
        
        # 价格信息
        price = s.find('div', attrs={'class':'price'}).find('div', attrs={'class':'mainInfo bold'}).text
        param.append(price)
        # 户型信息
        huxing = s.find('div', attrs={'class':'room'}).find('div', attrs={'class':'mainInfo'}).text.replace(' ', '')
        param.append(huxing)
        # 面积信息
        area = s.find('div', attrs={'class':'area'}).find('div', attrs={'class':'mainInfo'}).text.replace(' ', '')
        param.append(area)

        lis = s.find('table', attrs={'class':'aroundInfo'}).find_all('td')
        for l in lis:
            p = l.text.replace('\t', '').replace('\r\n', '').replace(' ', '').replace('\n', '')
            tmp = p.split('\n')
            for q in tmp:
                pq = q.split(u'\uff1a')
                if pq[0].startswith(u'房源编号'):
                    break;
                if len(pq) > 1:
                    param.append(pq[1])
                    print pq[0], pq[1]
        param.append(self.city)
        
        self.db.execute(sql, param)

  博主采用的手段比较低级,主要通过网页中的标签来获取相应的数据,后期可能通过xpath、正则表达式等方式来获取相应的内容。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

Ignite+CDH5.8安装配置 上一篇
CIFAR-10的Matlab可视化与转化 下一篇