鱼C论坛

 找回密码
 立即注册
查看: 1351|回复: 4

小白初写爬虫导出数据空白

[复制链接]
发表于 2019-5-28 19:06:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用的是Spyder3.7,按着书审查元素一步步打的,点运行后右边空白栏只有无数个    []
  1. from urllib import request
  2. from chardet import detect
  3. from bs4 import BeautifulSoup
  4. import re

  5. def getSoup(url):
  6.     #获取源码#
  7.     with request.urlopen(url) as fp:
  8.         byt = fp.read()
  9.         det = detect(byt)
  10.         return BeautifulSoup(byt.decode(det['encoding']),'lxml')
  11.    
  12.    
  13. def getData(soup):
  14.     #获取数据#
  15.     data = []
  16.     ol = soup.find('ol',attrs={'class':'grid_view'})
  17.     for li in ol.findAll('li'):
  18.         tep = []
  19.         titles = []
  20.         for span in li.findAll('span'):
  21.             if span.has_attr('class'):
  22.                 if span.attrs['class'][0] == 'title':
  23.                     titles.append(span.string.strip())
  24.                 elif span.attrs['class'][0] == 'rating_num':
  25.                     tep.append(span.string.strip())
  26.                 elif span.attrs['class'][0] == 'inq':
  27.                     tep.append(span.string.strip())
  28.                     tep.insert(0,titles)
  29.                     data.append(tep)
  30.                 return data
  31.             
  32.             
  33. def nextUrl(soup):
  34.     #获取下一页链接#
  35.     a = soup.find('a',text=re.compile("^后页"))
  36.     if a:
  37.         return a.attrs['href']
  38.     else:
  39.         return None
  40.    
  41.    
  42. if __name__ == '__main__':
  43.     url = "https://movie.douban.com/top250"
  44.     soup = getSoup(url)
  45.     print(getData(soup))
  46.     nt = nextUrl(soup)
  47.     while nt:
  48.         soup = getSoup(url + nt)
  49.         print(getData(soup))
  50.         nt = nextUrl(soup)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-29 10:37:57 | 显示全部楼层
在getData里加了几行print打印进行测试
  1. def getData(soup):
  2.     #获取数据#
  3.     data = []
  4.     ol = soup.find('ol',attrs={'class':'grid_view'})
  5.     for li in ol.findAll('li'):
  6.         tep = []
  7.         titles = []
  8.         for span in li.findAll('span'):
  9.             print("span")   # 会打印
  10.             if span.has_attr('class'):
  11.                 print("class")  # 会打印
  12.                 if span.attrs['class'][0] == 'title':
  13.                     print("title")  # 会打印
  14.                     titles.append(span.string.strip())
  15.                 elif span.attrs['class'][0] == 'rating_num':
  16.                     print("rating_num") # 不会打印
  17.                     tep.append(span.string.strip())
  18.                 elif span.attrs['class'][0] == 'inq':
  19.                     print("inq")    # 不会打印
  20.                     tep.append(span.string.strip())
  21.                     tep.insert(0,titles)
  22.                     data.append(tep)
  23.                 return data
  24.             
复制代码

发现data.append(tep)根本没执行,return data自然为空值了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-2 20:49:57 | 显示全部楼层
hjx123hjx 发表于 2019-5-29 10:37
在getData里加了几行print打印进行测试

发现data.append(tep)根本没执行,return data自然为空值了。

soup一行替换后输出无力
  1. runfile('D:/素材/豆瓣250 001.py', wdir='D:/素材')
  2. span
  3. class
  4. title
  5. []
  6. span
  7. class
  8. title
  9. []
  10. span
  11. class
  12. title
  13. []
  14. span
  15. class
  16. title
  17. []
  18. span
  19. class
  20. title
  21. []
  22. span
  23. class
  24. title
  25. []
  26. span
  27. class
  28. title
  29. []
  30. span
  31. class
  32. title
  33. []
  34. span
  35. class
  36. title
  37. []
  38. span
  39. class
  40. title
  41. []
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 23:44:21 | 显示全部楼层
本帖最后由 yjsx86 于 2019-6-3 00:19 编辑
takumi346 发表于 2019-6-2 20:49
soup一行替换后输出无力


有是有内容的 把data.append() 和 return 缩进改一改就行
不过你这代码看着费劲
  1. def getData(soup):
  2.     #获取数据#
  3.     data = []
  4.     ol = soup.find('ol',attrs={'class':'grid_view'})
  5.     for li in ol.findAll('li'):
  6.         tep = []
  7.         titles = []
  8.         for span in li.findAll('span'):
  9.             if span.has_attr('class'):
  10.                 if span.attrs['class'][0] == 'title':
  11.                     titles.append(span.string.strip())
  12.                 elif span.attrs['class'][0] == 'rating_num':
  13.                     tep.append(span.string.strip())
  14.                 elif span.attrs['class'][0] == 'inq':
  15.                     tep.append(span.string.strip())
  16.                     tep.insert(0,titles)
  17.             data.append(tep)
  18.     return data
复制代码


我只会requests 和 xpath 稍微改了改你的 你应该是只要 标题 评分 引用
  1. import requests
  2. from lxml import etree

  3. def gethtml(url):
  4.     #获取源码#
  5.     r = session.get(url)
  6.     return r.text
  7.    
  8.    
  9. def getData(html):
  10.     #获取数据#
  11.     selector = etree.HTML(html)
  12.     nodes = selector.xpath('//div[@class="info"]')
  13.     res = []
  14.     for node in nodes:
  15.         d = dict()
  16.         title = node.xpath('.//span[@class="title"]/text()')
  17.         rate = node.xpath('.//span[@class="rating_num"]/text()')
  18.         quote = node.xpath('.//span[@class="inq"]/text()')
  19.         d["title"] = ''.join(title).replace("\xa0", " ")
  20.         d['rate'] = rate[0]
  21.         d['quote'] = quote[0]
  22.         res.append(d)
  23.     return res

  24.    
  25. if __name__ == '__main__':
  26.     url = "https://movie.douban.com/top250"
  27.     session = requests.session()
  28.     html = gethtml(url)
  29.     data = getData(html)
  30.     for item in data:
  31.         string = 'title: {title}\nrate : {rate}\nquote: {quote}'.format(**item)
  32.         print(string, end="\n\n")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 21:50:11 | 显示全部楼层
1.建议每个函数调试一遍 一般不会出错了
2.网页源码去格式化一下再去分析
3.可以参考我爬的猫眼电影的代码,如下



import requests
import time
import pandas as pd
from lxml import etree

#获取电影信息
def get_page(url):
    try:
        headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
        res=requests.get(url,headers=headers)
        res.encoding='utf-8'
        html=etree.HTML(res.text)   
        index=html.xpath('//dl[@class="board-wrapper"]/dd/i/text()')   #排名
        title=html.xpath('//dl[@class="board-wrapper"]/dd/a/@title')   #电影名
        star=[i.strip()[3:] for i in html.xpath('//dl[@class="board-wrapper"]/dd/div//p[@class="star"]/text()')]  #主演               #列表推导式去除特殊字符
        release_time=[j.strip()[5:15] for j in html.xpath('//dl[@class="board-wrapper"]/dd/div//p[@class="releasetime"]/text()')]   #上映时间
        integer=html.xpath('//dl[@class="board-wrapper"]/dd/div//p[@class="score"]/i[1]/text()')
        fraction=html.xpath('//dl[@class="board-wrapper"]/dd/div//p[@class="score"]/i[2]/text()')     #评分
        rdata=list(map(lambda x:(index[x],title[x],star[x],release_time[x],integer[x]+fraction[x]),range(len(index))))
        data=pd.DataFrame(rdata)
        return data
    except Exception as e:
        return None

#写入csv文件
def write_to_file(data):
    header=['排名','电影名','主演','上映时间','评分']
    data.to_csv(r'C:\Users\Danta\Desktop\maoyandianying.csv',header=header,index=0,mode="a",encoding='ANSI')


def main(page):
    data=pd.DataFrame()
    for i in range(page):
        url='https://maoyan.com/board/4?offset='+str(i*10)
        data=data.append(get_page(url))
        time.sleep(2)
        print('第'+str(i+1)+'页爬取成功'+'\n')
    write_to_file(data)
    print('\n'+'写入完成')
   
   
if __name__=='__main__':
    main(10)
   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表