python爬虫如何分析一个将要爬取的网站?

Python012

python爬虫如何分析一个将要爬取的网站?,第1张

首先,你去爬取一个网站,

你会清楚这个网站是属于什么类型的网站(新闻,论坛,贴吧等等)。

你会清楚你需要哪部分的数据

你需要去想需要的数据你将如何编写表达式去解析。

你会碰到各种反爬措施,无非就是各种百度各种解决。当爬取成本高于数据成本,你会选择放弃。

你会利用你所学各种语言去解决你将要碰到的问题,利用各种语言的client组件去请求你想要爬取的URL,获取到HTML,利用正则,XPATH去解析你想要的数据,然后利用sql存储各类数据库。

一、爬取我们所需要的一线链接

channel_extract.py

这里的一线链接也就是我们所说的大类链接:

from bs4 import BeautifulSoupimport requests

start_url = 'http://lz.ganji.com/wu/'host_url = 'http://lz.ganji.com/'def get_channel_urls(url):

wb_data = requests.get(url)

soup = BeautifulSoup(wb_data.text, 'lxml')

links = soup.select('.fenlei >dt >a')#print(links)

for link in links:

page_url = host_url + link.get('href')

print(page_url)#get_channel_urls(start_url)channel_urls = '''

http://lz.ganji.com/jiaju/

http://lz.ganji.com/rirongbaihuo/

http://lz.ganji.com/shouji/

http://lz.ganji.com/bangong/

http://lz.ganji.com/nongyongpin/

http://lz.ganji.com/jiadian/

http://lz.ganji.com/ershoubijibendiannao/

http://lz.ganji.com/ruanjiantushu/

http://lz.ganji.com/yingyouyunfu/

http://lz.ganji.com/diannao/

http://lz.ganji.com/xianzhilipin/

http://lz.ganji.com/fushixiaobaxuemao/

http://lz.ganji.com/meironghuazhuang/

http://lz.ganji.com/shuma/

http://lz.ganji.com/laonianyongpin/

http://lz.ganji.com/xuniwupin/

'''123456789101112131415161718192021222324252627282930313233343536

那么拿我爬取的58同城为例就是爬取了二手市场所有品类的链接,也就是我说的大类链接;

找到这些链接的共同特征,用函数将其输出,并作为多行文本储存起来。

二、获取我们所需要的详情页面的链接和详情信息

page_parsing.py

1、说说我们的数据库:

先看代码:

#引入库文件from bs4 import BeautifulSoupimport requestsimport pymongo #python操作MongoDB的库import reimport time#链接和建立数据库client = pymongo.MongoClient('localhost', 27017)

ceshi = client['ceshi'] #建ceshi数据库ganji_url_list = ceshi['ganji_url_list'] #建立表文件ganji_url_info = ceshi['ganji_url_info']123456789101112

2、判断页面结构是否和我们想要的页面结构相匹配,比如有时候会有404页面;

3、从页面中提取我们想要的链接,也就是每个详情页面的链接;

这里我们要说的是一个方法就是:

item_link = link.get('href').split('?')[0]12

这里的这个link什么类型的,这个get方法又是什么鬼?

后来我发现了这个类型是

<class 'bs4.element.Tab>1

如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么

print soup.p['class']

#['title']12

还可以这样,利用get方法,传入属性的名称,二者是等价的

print soup.p.get('class')#['title']12

下面我来贴上代码:

#爬取所有商品的详情页面链接:def get_type_links(channel, num):

list_view = '{0}o{1}/'.format(channel, str(num))#print(list_view)

wb_data = requests.get(list_view)

soup = BeautifulSoup(wb_data.text, 'lxml')

linkOn = soup.select('.pageBox') #判断是否为我们所需页面的标志;

#如果爬下来的select链接为这样:div.pageBox >ul >li:nth-child(1) >a >span 这里的:nth-child(1)要删掉

#print(linkOn)

if linkOn:

link = soup.select('.zz >.zz-til >a')

link_2 = soup.select('.js-item >a')

link = link + link_2#print(len(link))

for linkc in link:

linkc = linkc.get('href')

ganji_url_list.insert_one({'url': linkc})

print(linkc)else:pass1234567891011121314151617181920

4、爬取详情页中我们所需要的信息

我来贴一段代码:

#爬取赶集网详情页链接:def get_url_info_ganji(url):

time.sleep(1)

wb_data = requests.get(url)

soup = BeautifulSoup(wb_data.text, 'lxml')try:

title = soup.select('head >title')[0].text

timec = soup.select('.pr-5')[0].text.strip()

type = soup.select('.det-infor >li >span >a')[0].text

price = soup.select('.det-infor >li >i')[0].text

place = soup.select('.det-infor >li >a')[1:]

placeb = []for placec in place:

placeb.append(placec.text)

tag = soup.select('.second-dt-bewrite >ul >li')[0].text

tag = ''.join(tag.split())#print(time.split())

data = {'url' : url,'title' : title,'time' : timec.split(),'type' : type,'price' : price,'place' : placeb,'new' : tag

}

ganji_url_info.insert_one(data) #向数据库中插入一条数据;

print(data)except IndexError:pass123456789101112131415161718192021222324252627282930

四、我们的主函数怎么写?

main.py

看代码:

#先从别的文件中引入函数和数据:from multiprocessing import Poolfrom page_parsing import get_type_links,get_url_info_ganji,ganji_url_listfrom channel_extract import channel_urls#爬取所有链接的函数:def get_all_links_from(channel):

for i in range(1,100):

get_type_links(channel,i)#后执行这个函数用来爬取所有详情页的文件:if __name__ == '__main__':# pool = Pool()# # pool = Pool()# pool.map(get_url_info_ganji, [url['url'] for url in ganji_url_list.find()])# pool.close()# pool.join()#先执行下面的这个函数,用来爬取所有的链接:if __name__ == '__main__':

pool = Pool()

pool = Pool()

pool.map(get_all_links_from,channel_urls.split())

pool.close()

pool.join()1234567891011121314151617181920212223242526

五、计数程序

count.py

用来显示爬取数据的数目;

import timefrom page_parsing import ganji_url_list,ganji_url_infowhile True:# print(ganji_url_list.find().count())

# time.sleep(5)

print(ganji_url_info.find().count())

time.sleep(5)

对于有一定编程经验的人来说,python相对好学些。

而其他人,则要看一点毅力和天赋了,因为学以致用,最终用python达到你的学习目的,才算有价值。若只是单纯的学学,开始也不算太难,但深入还是有一定难度的,特别是一些大项目。相比之下,python的一大好处,就是各类现成的实用库,几行代码就可以实现一个小目标。

python,将来还是蛮有用的,就连地产大佬潘石屹,都开始学python了(虽然不明白他的意图)。

人生苦短,我用python!