Ybing1021 发表于 2020-7-23 10:25

学了一学期Python,自己写的爬虫,请大佬们指正

老师课上只讲简单的语法,自己只能看教程摸索着学习,请大佬帮忙瞧瞧。
程序实现就是简单的把租房的房价爬下来再画出图来。
import requests
from bs4 import BeautifulSoup
import re
import matplotlib.pyplot as plt

def getHtmlText(url):                               #获取页面信息
    try:
      r=requests.get(url)                         #get页面
      r.raise_for_status()                        #判断有无异常
      r.encoding= r.apparent_encoding             #编码
      print('获取网页地址:',r.url)
      return r.text
    except:
      return "error"

def f_nameList(html):                               #获取房子标题
    soup= BeautifulSoup(html,"html.parser")
    fList=soup.find_all('a',{'class':'js-title value title-font'})          #寻找符合条件的a标签
    f_name=[]
    print("房子标题数量:",len(fList))
    for i in range(len(fList)):
      name=fList.string                #将标签中字符串保存到列表
      # print(name)
      f_name.append(name)
    for i in range(len(f_name)):
      print('{},{}'.format(i,f_name))

    # print(len(f_name))
    return f_name                            #返回列表

def f_priceList(html):               #获取房子价格
    soup = BeautifulSoup(html,"html.parser")
    pList=soup.find_all('div',{'class':'price'})
    f_price=[]
    print("价格爬取数量:",len(pList))
    # print(pList)
    for i in range(len(pList)):
      Price=pList.find_all('span',{'class':'num'})
      for j in range(len(Price)):
            price=eval(Price.string)
            # print(price)
            f_price.append(price)
    # print(f_price)
    # print(len(f_price))
    return f_price

def f_sizeList(html):               #获取房子平方米
    soup= BeautifulSoup(html,"html.parser")
    sList=soup.find_all('dd',{'class':'dd-item size'})
    f_size=[]
    # print(sList)
    print("平方米抓取数量:",len(sList))
    for i in range(len(sList)):
      Size=sList.find_all('span',string=re.compile('㎡'))       #正则表达式抓取平方
      for j in range(len(Size)):
            size=Size.string
            s=size.rstrip('㎡')
            s=eval(s)
            # print(type(s))
            f_size.append(s)
    # print(f_size)
    # print(len(f_size))
    return f_size

def printPlt(S):                              #绘制统计图
    f_size=[]
    f_price=[]
    plt.rcParams['font.family'] = ['SimHei']            #加载字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    for i in range(len(S)):
      f_price.append(S)
      f_size.append(S)
      x=f_size
      y=f_price
      plt.cla()                                        #清屏
      plt.scatter(x, y,marker='o', s=10,linewidths=1)         #散点图格式
      plt.title('赶集网青岛市租房平方米与房租价格关系图')       #标题
      plt.xlabel('平方米')                                    #x轴
      plt.ylabel('房租价格 元/月')                              #y轴
      plt.pause(0.01)                                          #刷新时间
    plt.show()                                          #开始绘制图


def main():                           #主函数
    pn=3
    f_List=[]
    name=[]
    price=[]
    size=[]
    start_url='http://qd.ganji.com/zufang/'             #赶集网青岛地区网址
    for i in range(pn):                                  #翻页
      try:
            url = start_url+'&pn'+str(i)                #翻页地址
            html = getHtmlText(url)
      except:
            continue
      n=f_nameList(html)                                    #整理列表格式
      p=f_priceList(html)
      s=f_sizeList(html)
      for j in range(len(n)):
            name.append(n)
            price.append(p)
            size.append(s)
    n=len(name)
    for i in range(n):
      f_List.append(,price,size])
    print("总抓取__{:_^20}__条租房信息。。。".format(len(f_List)))
    # print(f_List)
    sortList=sorted(f_List,key=(lambda x:x))   #给列表排序
    # print(sortList)
    printPlt(sortList)                           #给绘图函数传入列表

if __name__ == '__main__':
      main()




{:1_893:}{:1_893:}{:1_893:}

li13557771405 发表于 2020-7-23 14:52

你应该...............我配指导你吗{:1_896:}

Ybing1021 发表于 2020-7-23 16:01

li13557771405 发表于 2020-7-23 14:52
你应该...............我配指导你吗

交流交流,{:1_893:}

Ybing1021 发表于 2020-7-23 16:02

17720264720 发表于 2020-7-23 12:44
太秀了,作图简直了,优秀

一开始没想作图,只是感觉爬取数据太单调了,直接拿来做个图比较明显。。。。

thepoy 发表于 2020-7-24 00:00

看不出来有什么问题,requests爬数据大概都这样吧。一般涉及到翻页数据,我第一个想到的是用scrapy,数据爬到数据库里,再从数据库取数据进行处理。
绘图是真秀,我是从来没想过爬完数据直接绘图的,都是保存好数据后再处理。

Ybing1021 发表于 2020-7-24 09:53

thepoy 发表于 2020-7-24 00:00
看不出来有什么问题,requests爬数据大概都这样吧。一般涉及到翻页数据,我第一个想到的是用scrapy,数据爬 ...

还没有用过python链接数据库,{:1_907:}{:1_907:},不过感大佬的建议,我会尝试下改一改的
页: [1]
查看完整版本: 学了一学期Python,自己写的爬虫,请大佬们指正