python 爬虫项目

爬虫

爬虫核心:即利用requests获取网页的源码,然后利用匹配过滤进而获取到自己想要的东西

爬图片

思路:
①请求url然后返回出url的源码
②利用正则表达式或者"参数.findall()"匹配出url中的图片
③利用循环代下载即可
下载方法
1.利用with open() as fp: fp.write()命令进行下载

with open("dy.txt","w",encoding="utf-8") as fp:
        fp.write(cs)
        #或者类写法
         fp.write("{}\n".format(cs))
  

2.利用urlretrieve(url,filename,None)命令进行下载
3.利用PIL+requests+BytesIo的思路进行下载

#无效的参数类,典型导致的原因是变量设置可能出错导致
#'set' object has no attribute 'items'典型就是变量设置处出现问题导致
import requests
import re
import urllib.request
#注意没有这个属性类导致原因,即属性值类发生错误类导致
def open(url):
 headers={
    
    
     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 QIHU 360SE',
     }
 response=requests.get(url=url,headers=headers)
 response.conding='utf-8'
 html=response.text
 return (html)

def getimg(html):
    p=r'<img class="BDE_Image" src="([^"]+\.jpg)"'
    imglist=re.findall(p,html)
    for i in imglist:
        print(i)
        filename=i.split('/')[-1]
        urllib.request.urlretrieve(i,filename,None)

if __name__=='__main__':
    url='https://tieba.baidu.com/p/5704651315'
    getimg(open(url))

第三种方法下载

import requests
from PIL import Image
from io import BytesIO

response = requests.get(img_src)
image = Image.open(BytesIO(response.content))
image.save('D:/9.jpg')

如爬取百度贴吧

#python爬取网页时返回http状态码HTTP Error 418 即反爬程序返回导致,典型绕利用requests的请求方式进行请求代
import urllib.request
import re
import os
import urllib
#根据给定的网址来获取网页详细信息,得到的html就是网页的源代码 
def getHtml(url):
  page = urllib.request.urlopen(url)
  html = page.read()
  return html.decode('UTF-8')
 
def getImg(html):
  reg = r'src="(.+?\.jpg)" pic_ext'#另外一种匹配方式
  imgre = re.compile(reg)
  imglist = imgre.findall(html)#表示在整个网页中过滤出所有图片的地址,放在imglist中
  x = 0
  path = 'D:\\test'
  # 将图片保存到D:\\test文件夹中,如果没有test文件夹则创建
  if not os.path.isdir(path): 
    os.makedirs(path) 
  paths = path+'\\'   #保存在test路径下 
 
  for imgurl in imglist: 
    urllib.request.urlretrieve(imgurl,'{0}{1}.jpg'.format(paths,x)) #打开imglist中保存的图片网址,并下载图片保存在本地,format格式化字符串 
    x = x + 1
  return imglist




html = getHtml("https://photo.ihansen.org/trending")#获取该网址网页详细信息,得到的html就是网页的源代码 
print (getImg(html)) #从网页源代码中分析并下载保存图片

爬文字数据

一.爬取单个类

爬取思路

  1. 利用xpath结合requests库爬取(常适用于爬取豆瓣类电影信息网类)
#即导入使用的三个库
import requests
from lxml import html
etree=html.etree
url='https://www.nchu.edu.cn/xwzx/chyw/content_89584'
headers={
    
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}
rs=requests.get(url=url,headers=headers).text
#利用xpath解析数据
s=etree.HTML(rs)
nr=s.xpath('//*[@id="content"]/div/article/div[2]/div[2]/p[6]/text()')
print(nr)
  1. 利用正则表达式r‘’匹配规则类
    (常用于爬取小说类)
import requests #导入必备神器requests
import re #导入正则

url='http://www.jjwxc.net/onebook.php?novelid=109034&chapterid=4' 
response=requests.get(url)
response.encoding='gb2312'#根据要爬的网页的编码进行编码
html=response.text #转换成文本

info=re.findall(r'<div style="clear:both;"></div>([\s\S]*)<div id="favoriteshow_3" style="display:none" align="center"></div>',html)[0] #用什么形式展示返回的值

print (info)
#使用正则进行匹配小说内容
#print(info)#打印                      

二.爬取多个类

  1. 利用xpath+requests爬取一种格式的数据信息思路

爬取爬虫平台上的数据信息
重点:翻页
①info.xpath的匹配位置(即利用控制台获取其的xpath,然后研究其不同处,删除一个变量状况即可)
②循环控制翻页思路(与上面同,即找到不同,利用format(a*值)代即可)

#即需要使用的三个库
#即需要使用的三个库
import requests
from lxml import html
etree=html.etree
with open("dy.txt","w",encoding="utf-8") as fp:
 for a in range(10):#控制翻页的作用
  url='https://ssr1.scrape.center/page/{}'.format(a*1)
  headers={
    
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}
  rs=requests.get(url=url,headers=headers).text
#即代解析数据思路
  s=etree.HTML(rs)
  fy=s.xpath('//*[@id="index"]/div[1]/div[1]/div')#每一页的,思路即利用每一页的不同获取通用的
  for info in fy:
    cs = info.xpath('./div/div/div[2]/a/h2/text()')[0]#即无[]的含义,注意如果有标签类,注意利用引用标签的思路代,即有标签名即@标签名,如@title 无就/text()
    fp.write("{}\n".format(cs))  
  1. 爬取一个网站中全部东西的内容思路类
    如 爬取小说
    四个子函数+一个main函数
    进行利用调用的形式类获取内容

    一个获取所有小说名单的函数(利用其返回链接)
    一个获取该链接中的源码
    一个利用对该源码进行匹配(匹配出该源码中的所有章节与和其对应的url地址)
    一个函数获取该url中的内容即可
    这里的话这一个的话就给别人写的一个源码

import requests
from bs4 import BeautifulSoup
import time
import codecs

start = time.clock()

#在小说大全界面获取所有小说名单
novellist = {
    
    }
def getnovels(html):
    soup = BeautifulSoup(html,'lxml')
    list = soup.find('div',class_='novellist').find_all('a')
    baseurl = 'http://www.paoshu8.com'
    for l in list:
        novellist[l.string] = baseurl+str(l['href']).replace('http:','')

#获取页面html源码
def getpage(url):
    headers = {
    
    
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    }
    page = requests.get(url).content.decode('utf-8')
    return page

chaptername = []  #存放小说章节名字
chapteraddress = []     #存放小说章节地址
#获取小说所有章节以及地址
def getchapter(html):
    soup = BeautifulSoup(html,'lxml')
    try:
        alist = soup.find('div',id='list').find_all('a')
        for list in alist:
            chaptername.append(list.string)
            href = 'http://www.paoshu8.com'+list['href']
            chapteraddress.append(href)
        return True
    except:
        print('未找到章节')
        return False

#获取章节内容
def getdetail(html):
    soup = BeautifulSoup(html,'lxml')
    try:
        content = '     '
        pstring = soup.find('div',id='content').find_all('p')
        for p in pstring:
            content += p.string
            content += '\n      '
        return content
    except:
        print('出错')
        return '出错'

url = 'http://www.paoshu8.com/xiaoshuodaquan/' #小说大全网址
html = getpage(url)
getnovels(html)  #获取小说名单

name = input('请输入想要下载小说的名字:\n')
if name in novellist:
    print('开始下载')
    url = str(novellist[name])
    html = getpage(url)
    getchapter(html)
    file = codecs.open('F:\文档'+name+'.txt','w','utf-8')  #小说存放在本地的地址
    count = len(chapteraddress)
    for i in range(len(chapteraddress)):
        curl = str(chapteraddress[i])
        chtml = getpage(curl)
        content = '\n' + getdetail(chtml) + '\n'  #为了保持小说有格式
        title = '\n           第'+str(i+1)+'章  '+str(chaptername[i])+'         \n'
        file.write(title+content)
        print('{:.3%}'.format(i/count)+'  '+chaptername[i])
    file.close()
    end = time.clock()
    print('下载完毕,总耗时',end-start,'秒')
else:
    print('未找见该小说')

爬取一个芊芊字典的资源链接类

import requests
import re
import time
from bs4 import BeautifulSoup
from lxml import html

start=time.clock()
with open("qqzd.txt","w",encoding="utf-8")as fp:
 x=int(input("请输入需要爬取的页数:\n"))#将input的值转换为整数值的方法
 for i in range(x):#更改爬取页数
     url='https://myqqjd.com/android/page/{}'.format(i*1)
     headers={
    
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}
     rs=requests.get(url=url,headers=headers).text
     fy=re.findall(r'<h2 class="entry-title">([\s\S]*?)</h2>',rs)#匹配网页
     #即对于赋值正则表达式中的思路,必须使用解析器解析后才可进行赋值
     soup = BeautifulSoup(str(fy),'lxml')
     fs=soup.find_all('a')  
     for a in fs:
       b=a['href'].replace('https://myqqjd.com/','https://myqqjd.com/wp-content/themes/begin/down.php?id=')
       c=b.replace('.html','')
       response=requests.get(url=c,headers=headers).text
       d=re.findall(r'<div class="down-but"><a href="([\s\S]*?)" target="_blank"><i class="be be-download"></i> 网盘下载</a></div>	',response)
       print (a.string,d[0])
       fp.write("{}\n{}\n".format(a.string,d[0]))#消去[]号的作用
       end=time.clock()
     if i==(x-1):
       print ("爬取完成,总耗时",end-start,'秒')
    

合并文件项目

需要模块
①xlrd(负责读取数据)
②XlsxWriter(负责写入数据)
③glob2或者glob3(查找符合自己目的的文件)

猜你喜欢

转载自blog.csdn.net/qq_33942040/article/details/108355895