日期:2021.05.05
作者:杨传伟
完成任务:学习爬虫的xpath解析,使用xpath解析爱奇艺网站电影片库首页电影数据(电影名字、播放链接、评分、播放权限)并存到数据库。
爬虫源码:
1 url='https://list.iqiyi.com/www/1/-------------11-1-1-iqiyi--.html'
2 headers={
3 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
4 'Chrome/90.0.4430.93 Safari/537.36'
5 }
6 #获取爱奇艺电影大全主界面response
7 response=requests.get(url=url,headers=headers)
8 response.encoding='utf-8'
9 #获取页面的全部html
10 page_text=response.text
11 # html=BeautifulSoup(page_text,"lxml")
12 # bs_li=html.find_all('li',class_="qy-mod-li")
13 # print(bs_li)
14 #打印输出页面html
15 # print(page_text)
16 #实例化xpath对象
17 etree_=etree.HTML(page_text)
18 #获取电影的所有li标签
19 ul_list=etree_.xpath('//ul[@class="qy-mod-ul"]/li')
20 # print(ul_list[0])
21 temp_list=[] #声明一个list存储单部电影的所有信息
22 dataRes=[] #声明一个总list存储所有的电影
23 #BeautifulSoup 解析播放状态
24 # findState=re.compile(r'"<img src="(.*?)"')
25 # for li in bs_li:
26 # words=str(li)
27 # print(words)
28 # temp_state=re.findall(findState,words)
29 # print(temp_state)
30
31 for li in ul_list:
32 name=li.xpath('./div/div[2]/p[1]/a/@title') #获取电影名字
33 score = li.xpath('./div/div[2]/p[1]/span/text()') # 获取电影评分
34 link=li.xpath('./div/div[2]/p[1]/a/@href') #获取电影链接
35 if(len(score)==0): #如果评分信息没有 重新赋值
36 score="暂无评分"
37 if (len(link) == 0): # 如果链接信息没有 重新赋值
38 score = "#"
39 link=str.replace(link[0],"//","") #因为链接是带有 这样 // 的两个斜杠 所以要替换一下
40 #解析播放状态
41 #//*[@id="block-D"]/ul/li[5]/div/div[1]/a/div[2]/img
42 state=li.xpath('./div/div[1]/a/div[2]/img/@src')
43 # print(state)
44 temp_list.append(name[0])
45 temp_list.append(score[0])
46 temp_list.append(link)
47
48 # print(temp_list)
49 dataRes.append(temp_list) #把爬取到的每一部电影存到总list中也就是 dataRes
50 temp_list=[] #给单部电影list重新赋值为空list
51 print(dataRes)
截图示例:
5.5 李楠
今日初步实现了手机端页面的前端,主要分为首页:将来显示推荐电影,分类:将来分类查找电影,我的:查看个人信息以及收藏内容。三个页面实现了底部导航栏切换与滑屏切换,使用了Fragment与viewpager实现。
主要代码:
Xml部分:
1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".MainActivity">
8
9
10 <RadioGroup
11 android:id="@+id/main_group"
12 android:layout_width="match_parent"
13 android:layout_height="56dp"
14 android:layout_alignParentBottom="true"
15 android:background="#ffffff"
16 android:orientation="horizontal">
17
18 <RadioButton
19 android:id="@+id/main_rb_first"
20 style="@style/tab_menu_item"
21 android:drawableTop="@drawable/firstpage"
22 android:text="首页" />
23
24 <RadioButton
25 android:id="@+id/main_rb_cloud"
26 style="@style/tab_menu_item"
27 android:drawableTop="@drawable/cloudpage"
28 android:text="分类" />
29
30 <RadioButton
31 android:id="@+id/main_rb_my"
32 style="@style/tab_menu_item"
33 android:drawableTop="@drawable/mypage"
34 android:text="我的" />
35
36
37 </RadioGroup>
38
39 <View
40 android:id="@+id/div_tab_bar"
41 android:layout_width="match_parent"
42 android:layout_height="2px"
43 android:layout_above="@id/main_group"
44 android:background="#DFDBDB" />
45
46 <androidx.viewpager.widget.ViewPager
47 android:id="@+id/vpager"
48 android:layout_width="match_parent"
49 android:layout_height="match_parent"
50 android:layout_above="@id/div_tab_bar"/>
51
52 </RelativeLayout>
MyFragmentPagerAdapter:
1 package com.example.cloudlibrary.Adapter;
2
3 import android.view.ViewGroup;
4
5 import androidx.fragment.app.Fragment;
6 import androidx.fragment.app.FragmentManager;
7 import androidx.fragment.app.FragmentPagerAdapter;
8
9 import com.example.cloudlibrary.Fragment.CloudPageFragment;
10 import com.example.cloudlibrary.Fragment.FirstPageFragment;
11 import com.example.cloudlibrary.Fragment.MyPageFragment;
12 import com.example.cloudlibrary.MainActivity;
13
14 public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
15 private final int PAGER_COUNT = 3;
16 private CloudPageFragment cloudPageFragment = null;
17 private FirstPageFragment firstPageFragment = null;
18 private MyPageFragment myPageFragment = null;
19
20
21 public MyFragmentPagerAdapter(FragmentManager fm) {
22 super(fm);
23 cloudPageFragment = new CloudPageFragment();
24 firstPageFragment = new FirstPageFragment();
25 myPageFragment = new MyPageFragment();
26 }
27
28
29 @Override
30 public int getCount() {
31 return PAGER_COUNT;
32 }
33
34 @Override
35 public Object instantiateItem(ViewGroup vg, int position) {
36 return super.instantiateItem(vg, position);
37 }
38
39 @Override
40 public void destroyItem(ViewGroup container, int position, Object object) {
41 System.out.println("position Destory" + position);
42 super.destroyItem(container, position, object);
43 }
44
45 @Override
46 public Fragment getItem(int position) {
47 Fragment fragment = null;
48 switch (position) {
49 case MainActivity.PAGE_ONE:
50 fragment = firstPageFragment;
51 break;
52 case MainActivity.PAGE_TWO:
53 fragment = cloudPageFragment;
54 break;
55 case MainActivity.PAGE_THREE:
56 fragment = myPageFragment;
57 break;
58 }
59 return fragment;
60 }
61
62 }
每个页面的Fragment都是类似的,目前没有实际内容只返回了一个页面:
1 package com.example.cloudlibrary.Fragment;
2
3 import androidx.annotation.NonNull;
4 import androidx.annotation.Nullable;
5 import androidx.appcompat.app.AppCompatActivity;
6 import androidx.fragment.app.Fragment;
7
8 import android.os.Bundle;
9 import android.view.LayoutInflater;
10 import android.view.View;
11 import android.view.ViewGroup;
12
13 import com.example.cloudlibrary.R;
14
15 public class FirstPageFragment extends Fragment {
16
17 public FirstPageFragment(){
18 }
19 @Override
20 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
21 View view = inflater.inflate(R.layout.activity_first_page, container, false);
22 return view;
23 }
24 }
5.5 章英杰
任务进度:完成了页面“电影TOP榜”和广告分块部分。其中“电影TOP榜”部分的每一个电影模块也分为了两个div模块——
电影海报部分和电影详情部分,
在广告部分中,每一个广告可设为一个div模块。
产品页面:
任务看板